标签: collectors

Java 8 Stream API收集器问题

我正在遍历图形的边缘,并希望得到所有源和目标的列表.这是我到目前为止:

public Set<Vertex> getVertices(){

    Set<Vertex> vertices = this.edges.stream().map(edge -> edge.getSource()).collect(Collectors.toSet());
    vertices.addAll(this.edges.stream().map(edge -> edge.getTarget()).collect(Collectors.toSet()));
    return vertices;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在同一个映射/收集步骤中获取源和目标?像(PSEUDO-CODE)这样的东西:

edges.stream().collect(edge.getSource()).collect(edge.getTarget())
Run Code Online (Sandbox Code Playgroud)

或普通的旧Java 7

for ( Edge e : edges ){
    vertices.add(e.getSource());
    vertices.add(e.getTarget());
}
Run Code Online (Sandbox Code Playgroud)

干杯,丹尼尔

java java-8 java-stream collectors

2
推荐指数
2
解决办法
195
查看次数

Java 8 lambdas嵌套Map

我正在尝试使用Java-8 lambdas来解决以下问题:

给定一个List<Transaction>,对于每一个Category.minorCategory我需要的总和Transaction.amountCategory.minorCategoryMapTransaction.accountNumber与总和Transaction.amountTransaction.accountNumber.根据下面的代码,我有这个工作.我现在要求分组Category.majorCategory,基本上返回一个Map<String, Map<String, MinorCategorySummary>>键入Category.majorCategory.

我一直在努力,直到分组的阶段,Category.majorCategory但很难看到解决方案; 编程与lambdas的范式转换证明了一个陡峭的学习曲线.

TransactionBreakdown是行动发生的地方,我想回到哪里Map<String, Map<String, MinorCategorySummary>>.

public class Transaction {

    private final String accountNumber;
    private final BigDecimal amount;
    private final Category category;

}

public class Category {

    private final String majorCategory;
    private final String minorCategory;

}

public class MinorCategorySummary {

    private final BigDecimal sumOfAmountPerMinorCategory;
    private final Map<String, BigDecimal> accountNumberSumOfAmountMap; …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 java-stream collectors

2
推荐指数
1
解决办法
3980
查看次数

什么是Java 8 Stream API中的收集器的默认Set/List实现?

我在Java 8下面有代码快照.

 List<Employee> employees = DataProvider.getEmployees();
 Set<Employee> set = employees.stream().filter(emp -> {
                System.out.println(emp.getName());
                return emp.getName().equals("Vishal");
            }).collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

我只是想知道Set它在使用时使用默认的哪个实现Collectors.toSet()(参见上面的例子)?

另外,有没有办法表明java API使用特定的实现(例如HashSet)?

java-8 java-stream collectors

2
推荐指数
1
解决办法
665
查看次数

Collectors.toMap的默认返回值

如果我们成像,我们有一个名为person的对象,而人看起来像下面这样:

class Person {
    int id;
    String name;
    String country
    // ...
    // getter/setter
}
Run Code Online (Sandbox Code Playgroud)

我们有一个ListPerson对象,我们要"转换"到一个地图.我们可以使用以下内容:

Map<Long, List<Person>> collect = personList.stream().
    collect(Collectors.toMap(Person::getId, p -> p));
Run Code Online (Sandbox Code Playgroud)

但是可以返回valuemapper的默认值并更改valuemapper的类型?

我想过这样的事情:

Map<Long, List<Person>> collect = 
     personList.stream().collect(Collectors.groupingBy(Person::getId, 0));
Run Code Online (Sandbox Code Playgroud)

但有了这个我得到以下错误 is not applicable for the arguments

我有一个解决方法,但我认为它不是很漂亮.

Map<Long, Object> collect2 = personList.stream().
    collect(Collectors.toMap(Person::getId, pe -> {
            return 0;
    }));
Run Code Online (Sandbox Code Playgroud)

java lambda dictionary java-8 collectors

2
推荐指数
1
解决办法
772
查看次数

如何使用Java8流从嵌套对象组装Map <Key,Value>?

假设我有3辆汽车,每辆汽车有3个发动机,每个发动机有3个零件.如何map of <engine_model, List<parts>>使用Java8流创建一个?

在常规Java中,我会执行以下操作:

Map<String, List<Parts>> map = new HashMap<String, List<Parts>>();
for (Car car: cars){
  for (Engine engine: car.getEngines()){
    if (!map.contains(engine.getModel())){
      map.put(engine.getModel(), new ArrayList<Part>());
    }
    for (Part  part: engine.getParts()){
      map.get(engine.getModel()).add(part);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

map是一个map将引擎的model(type String)映射到与该模型相关的所有部件的列表.不同的车可以有相同的发动机型号.

我试着做以下事情:

carList.stream().flatMap(p -> p.getEngines().stream())
  .collect(Collectors.groupingBy(p -> p.getModel(),
               Collectors.mapping(Engine::getParts, Collectors.toList())))
Run Code Online (Sandbox Code Playgroud)

问题是上面的使用我得到了 Map<String, List<List<Part>>> 我想要的 Map<String, List<Part>>

我想一个等效的问题是:我怎么改变List of Lists,只是List在上面的例子中的情况下?

java dictionary java-8 java-stream collectors

2
推荐指数
1
解决办法
1792
查看次数

为什么我应该使用collect(Collectors.toList()),当我没有它时?

我在许多Java 8参考资料和示例中看到了以下代码:

List <Integer> l = Arrays.asList(7, 3, 9, 8, 6, 5, -1, -100);  

l.stream().filter(y -> y <l.get(0)).collect(Collectors.toList()).
      forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

但是,我可以使用以下方法获得相同的结果:

l.stream().filter(y -> y <l.get(0)).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

那么,使用几乎普遍使用的collect(Collectors.toList())的神圣性是什么?

java java-8 java-stream collectors

2
推荐指数
1
解决办法
1394
查看次数

collectAndThen方法是否足够有效?

我最近开始使用collectAndThen,发现与其他编码程序相比,它需要花费相当长的时间,我用它来执行类似的任务.

这是我的代码:

        System.out.println("CollectingAndThen");
        Long t = System.currentTimeMillis();
        String personWithMaxAge = persons.stream()
                                        .collect(Collectors.collectingAndThen(
                                                                Collectors.maxBy(Comparator.comparing(Person::getAge)),
                                                                (Optional<Person> p) -> p.isPresent() ? p.get().getName() : "none"
                                                ));


        System.out.println("personWithMaxAge - "+personWithMaxAge + " time taken = "+(System.currentTimeMillis() - t));
        Long t2 = System.currentTimeMillis();
        String personWithMaxAge2 = persons.stream().sorted(Comparator.comparing(Person::getAge).reversed())
                                                    .findFirst().get().name;
        System.out.println("personWithMaxAge2 : "+personWithMaxAge2+ " time taken = "+(System.currentTimeMillis() - t2));
Run Code Online (Sandbox Code Playgroud)

在这里输出:

CollectingAndThen
personWithMaxAge - Peter time taken = 17
personWithMaxAge2 : Peter time taken = 1
Run Code Online (Sandbox Code Playgroud)

这表明收集和收集时间相对较长.

所以我的问题是 - 我应该继续收集和其他建议吗?

java collect java-8 java-stream collectors

2
推荐指数
3
解决办法
1894
查看次数

为什么我在Java 8 Lambda中使用"Collectors.toList()"而不是"Collectors :: toList"?

通常在a之后flatMap,我们collect(Collectors.toList())用来收集数据并返回一个List.

但为什么我不能用Collectors::toList呢?我试图使用它,但得到了编译错误.

我试图搜索这个,但找不到任何解释.

非常感谢.

java lambda tolist collectors

2
推荐指数
2
解决办法
544
查看次数

如何扩展收藏家课

为什么Collectors在Java 8中类是final?我想在自己的课堂上扩展Collectors课堂MyCollectors。我将在其中添加Collectors类中不存在的其他方法。

java java-8 java-stream collectors

2
推荐指数
1
解决办法
96
查看次数

Java 8:如何从列表中创建映射,在该列表中,键是从与对象(员工)本身相同的类(empID)和值中获取的?

在Java 8中,如何从列表转换为映射的形式empID来自类内部和作为对象本身的值。

List<CompanyEntity> result = 
             ifEntityManager.createNamedQuery("findByEmployeeId", CompanyEntity.class)
             .getResultList();
Map<String, CompanyEntity> result1 = result.stream()
        .collect(Collectors.toMap(CompanyEntity::getEmployeeId, CompanyEntity::this)); ??
Run Code Online (Sandbox Code Playgroud)

我想要第二个参数toMap作为对象本身。有人可以建议如何实现相同目标吗?

我尝试这样做,Collectors.toMap(CompanyEntity::getEmployeeId, this)但无法摆脱编译错误。

java arraylist hashmap java-8 collectors

2
推荐指数
1
解决办法
54
查看次数