Tag: java stream

按Java 8中的Map列表分组

我有一个像这样的列表: List<Map> 有没有办法,使用lambda,将此列表转换为: Map<String, List> 例: Map m1 = new HashMap(); m1.put(“A”, 1); m1.put(“B”, 100); Map m2 = new HashMap(); m2.put(“A”, 10); m2.put(“B”, 20); m2.put(“C”, 100); List<Map> beforeFormatting = new ArrayList(); beforeFormatting.add(m1); beforeFormatting.add(m2); 格式化后: Map<String, List> afterFormatting; 看起来像是这样的: A -> [1, 10] B -> [100, 20] C -> [100]

并行转换流时如何使用收集器

我实际上试图回答这个问题如何跳过从Files.lines获得的Stream 的行 。 所以我虽然这个收集器并不能很好地并行工作: private static Collector<String, ?, List> oddLines() { int[] counter = {1}; return Collector.of(ArrayList::new, (l, line) -> { if (counter[0] % 2 == 1) l.add(line); counter[0]++; }, (l1, l2) -> { l1.addAll(l2); return l1; }); } 但它的确有效。 编辑:它实际上没有工作; 我被我的输入集太小而无法触发任何并行性这一事实所迷惑; 见评论中的讨论 。 我认为它不会起作用,因为我想到了以下两个执行计划。 1. counter数组在所有线程之间共享。 线程t1读取Stream的第一个元素,因此满足if条件。 它将第一个元素添加到其列表中。 然后在他有时间更新数组值之前停止执行。 线程t2,从流的第4个元素开始,将其添加到其列表中。 所以我们最终得到了一个非想要的元素。 当然,既然这个collections家似乎有效,我猜它不会那样。 而且无论如何更新都不是primefaces的。 2.每个线程都有自己的数组副本 […]

如何链接和应用比较器流?

我有一系列未分类的项目和一组比较器。 我想通过使用“thenComparing”(Multisort)将所有比较器应用到流中。是否有比以下代码更优雅的方式来实现这一点? Stream unsorted = …; Stream comparators = …; Comparator compareFunc = comparators.reduce(null, (a, b) -> { if(a == null) { return b; }else { return a.thenComparing(b); } }); Stream result = unsorted.sorted(compareFunc);

Java 8 Stream API中的多个聚合函数

我有一个类定义的类 public class TimePeriodCalc { private double occupancy; private double efficiency; private String atDate; } 我想使用Java 8 Stream API执行以下SQL语句。 SELECT atDate, AVG(occupancy), AVG(efficiency) FROM TimePeriodCalc GROUP BY atDate 我试过了 : Collection collector = result.stream().collect(groupingBy(p -> p.getAtDate(), …. 可以在代码中添加什么来选择多个属性? 我正在考虑使用多个收集器,但实际上不知道如何操作。

如何在Stream上短路减少?

假设我有一个布尔值流,我正在编写的reduce操作是|| (要么)。 我能否以一种方式编写它,以便在遇到true值时至少放弃对某些元素的评估? 我正在寻找一些优化(可能是它是一个并行流),不一定是完全优化,虽然后者会很棒。

在并行流上调用顺序会使所有先前的操作顺序进行

我有一个重要的数据集,并希望调用缓慢但干净的方法,而不是调用带有副作用的快速方法对第一个结果。 我对中间结果不感兴趣,所以我不想收集它们。 显而易见的解决方案是创建并行流,进行慢速呼叫,再次使流顺序,并进行快速呼叫。 问题是,所有代码都在单线程中执行,没有实际的并行性。 示例代码: @Test public void testParallelStream() throws ExecutionException, InterruptedException { ForkJoinPool forkJoinPool = new ForkJoinPool(Runtime.getRuntime().availableProcessors() * 2); Set threads = forkJoinPool.submit(()-> new Random().ints(100).boxed() .parallel() .map(this::slowOperation) .sequential() .map(Function.identity())//some fast operation, but must be in single thread .collect(Collectors.toSet()) ).get(); System.out.println(threads); Assert.assertEquals(Runtime.getRuntime().availableProcessors() * 2, threads.size()); } private String slowOperation(int value) { try { Thread.sleep(100); } […]

有没有像“(k,v)”那样流式传输地图而不是使用(条目)?

基本上我寻找一种避免使用的方法 entry -> entry.getValue 和 entry -> entry.getKey 类似于Map.forEach()function。 如果只有我可以得到一种工作方式map.stream().filter((k,v) -> ) …等等 看起来这个界面叫做BiConsumer。 或许转换为BiConsumer转换器或Stream.generate()

带有spring注释方法的Java .parallelStream()

我尝试使用带有Spring @Transactional注释的DAO中的parallelStream()并得到如此问题: @Transactional public void processCollection(Collection objects) { objects.parallelStream() .forEach(this::processOne); //throw exception } @Transactional public void processOne(Object o) { … } 工作正确: @Transactional public void processCollection(Collection objects) { objects.stream() .forEach(this::processOne); //work correctly } @Transactional public void processOne(Object o) { … } 例外: org.hibernate.HibernateException: No Session found for current thread org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:106) org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:978) 如何通过parallelStream()使用@Transactional注释方法? 更新为什么会发生这种情况Spring事务管理器和multithreading但是我希望Spring 4支持java 8可以为此提供一些解决方案。 […]

如何在Stream上重用filter和地图的应用程序?

我有一组从共享类型inheritance的域对象(即GroupRecord extends Record , RequestRecord extends Record )。 子类型具有特定属性(即GroupRecord::getCumulativeTime , RequestRecord::getResponseTime )。 此外,由于解析日志文件,我有一个混合子类型的记录列表。 List records = parseLog(…); 为了计算日志记录的统计数据,我想仅在与特定子类型匹配的记录子集上应用数学函数,即仅在GroupRecord 。 因此,我希望有一个特定子类型的过滤流。 我知道我可以使用filter并map到子类型 records.stream() .filter(GroupRecord.class::isInstance) .map(GroupRecord.class::cast) .collect(… 在流上多次应用此filter和强制转换(特别是当为不同的计算多次执行相同的子类型时)不仅繁琐,而且会产生大量重复。 我目前的方法是使用TypeFilter class TypeFilter{ private final Class type; public TypeFilter(final Class type) { this.type = type; } public Stream filter(Stream inStream) { return inStream.filter(type::isInstance).map(type::cast); } } 要应用于流: TypeFilter groupFilter = […]

如何从DirectoryStream创建流

在阅读DirectoryStream的API时,我错过了很多function。 首先,它建议使用for循环从流到List 。 我错过了DirectoryStream不是Stream的事实。 如何从Java 8中的DirectoryStream创建Stream ?