我正在遍历图形的边缘,并希望得到所有源和目标的列表.这是我到目前为止:
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-8 lambdas来解决以下问题:
给定一个List<Transaction>,对于每一个Category.minorCategory我需要的总和Transaction.amount每Category.minorCategory和Map的Transaction.accountNumber与总和Transaction.amount每Transaction.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 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)?
如果我们成像,我们有一个名为person的对象,而人看起来像下面这样:
class Person {
int id;
String name;
String country
// ...
// getter/setter
}
Run Code Online (Sandbox Code Playgroud)
我们有一个List的Person对象,我们要"转换"到一个地图.我们可以使用以下内容:
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) 假设我有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 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())的神圣性是什么?
我最近开始使用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)
这表明收集和收集时间相对较长.
所以我的问题是 - 我应该继续收集和其他建议吗?
通常在a之后flatMap,我们collect(Collectors.toList())用来收集数据并返回一个List.
但为什么我不能用Collectors::toList呢?我试图使用它,但得到了编译错误.
我试图搜索这个,但找不到任何解释.
非常感谢.
为什么Collectors在Java 8中类是final?我想在自己的课堂上扩展Collectors课堂MyCollectors。我将在其中添加Collectors类中不存在的其他方法。
在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)但无法摆脱编译错误。
collectors ×10
java ×9
java-8 ×9
java-stream ×7
lambda ×3
dictionary ×2
arraylist ×1
collect ×1
hashmap ×1
tolist ×1