Tag: java stream

获得Java 8流的最小值和最大值的简明方法

有一种简洁的方法可以在一次传递中提取流的最小值和最大值(基于某个比较器)吗? 似乎有很多方法可以单独获取最小值和最大值,或者我可以将流排序为临时对象,例如: List sorted = Stream.of(…).sorted().collect(Collectors.toList()); T min = sorted.get(0); T max = sorted.get(sorted.size() – 1); 但这并不简洁,需要分配一个临时对象。 我宁愿不分配临时对象或在流中进行两次传递。 还有其他选择吗? Pair extent = Stream.of(…).???

Java 8 Stream与集合存储

我一直在阅读Java 8 Streams以及从数据源流式传输数据的方式,而不是让整个集合从中提取数据。 特别是我引用了一篇关于Java 8中的流的文章。 “没有存储。流没有值存储;它们通过一系列计算步骤从源(可能是数据结构,生成函数,I / O通道等)传输值。” 来自: http : //www.drdobbs.com/jvm/lambdas-and-streams-in-java-8-libraries/240166818?pgno = 1 我理解从一个源一步一步地流式传输数据的概念。 我不明白的是,如果你是从一个集合流式传输,怎么没有存储? 该集合已存在于Heap中,您只是从该集合中流式传输数据,该集合已存在于“存储”中。 如果我只是通过标准for循环遍历集合,那么内存占用的区别是什么?

Java Streams:将List分组到Maps地图中

我如何使用Java Streams执行以下操作? 假设我有以下课程: class Foo { Bar b; } class Bar { String id; String date; } 我有一个List ,我想将它转换为Map <Foo.b.id, Map 。 即: 首先由Foo.b.id ,然后由Foo.b.date 。 我正在努力采用以下两步法,但第二步甚至没有编译: Map<String, List> groupById = myList .stream() .collect( Collectors.groupingBy( foo -> foo.getBar().getId() ) ); Map<String, Map> output = groupById.entrySet() .stream() .map( entry -> entry.getKey(), entry -> entry.getValue() .stream() .collect( […]

Java 8:从List中查找最小值索引

假设我有一个包含元素的列表(34, 11, 98, 56, 43) 。 使用Java 8流,如何找到列表中最小元素的索引(例如,在这种情况下为1)? 我知道这可以使用list.indexOf(Collections.min(list))在Java中轻松完成。 但是,我正在寻找类似Scala的解决方案,我们可以简单地说List(34, 11, 98, 56, 43).zipWithIndex.min._2来获取最小值的索引。 有没有什么可以使用流或lambda表达式(比如Java 8特定function)来实现相同的结果。 注意:这仅用于学习目的。 我在使用Collections实用程序方法时没有任何问题。

Java流排序2变量升序/取消发送

我想排序seq1升序和seq2降序所以我这样做: list = list.stream().sorted(comparing(AClass::getSeq1).thenComparing( AClass::getSeq2).reversed()).collect(toList()); 但结果出来了,因为seq1和seq2都按降序排序。 我可以这样做以使seq1升序和seq2降序: sorted(comparing(AClass::getSeq1) .reversed().thenComparing(AClass::getSeq2).reversed() 这是真正的正确方法吗?

RxJava与Java 8并行流

它们之间有什么相似之处和不同之处,看起来Java Parallel Stream有一些RXJava中可用的元素,是吗?

Java 8流中的聚合运行时exception

假设我有一个抛出运行时exception的方法。 我正在使用Stream在列表中的项目上调用此方法。 class ABC { public void doStuff(MyObject myObj) { if (…) { throw new IllegalStateException(“Fire! Fear! Foes! Awake!”); } // do stuff… } public void doStuffOnList(List myObjs) { try { myObjs.stream().forEach(ABC:doStuff); } catch(AggregateRuntimeException??? are) { … } } } 现在我希望处理列表中的所有项目,并将各个项目的任何运行时exception收集到最终将抛出的“聚合”运行时exception中。 在我的真实代码中,我正在进行第三方API调用,这可能会引发运行时exception。 我想确保处理所有项目并在最后报告任何错误。 我可以想出一些方法来解决这个问题,例如map()函数捕获并返回exception( ..shudder .. )。 但有没有一种本地方式来做到这一点? 如果没有,是否还有另一种干净利落的方式?

使用parallelStream foreach创建HashMap,但有时值为空

Java代码如: List DbDetails = … Like 50000 rows records Map<Long, List> details = new HashMap(); DbDetails .parallelStream().forEach(detail -> { Long id = detail.getId(); details.computeIfAbsent(id, v -> new ArrayList()).add(detail); }); Then … details.entrySet().stream().forEach(e -> { e.getValue(); // Some value is empty }); 我猜是因为HashMap是线程不安全的,所以我使用Hashtable而不是它。 然后它运行正常,所有值都有价值,但我不知道为什么?

累积Java流,然后才对其进行处理

我有一个类似于以下内容的文档: data.txt中 100, “some text” 101, “more text” 102, “even more text” 我使用正则表达式处理它并返回一个新的处理文档如下: Stream lines = Files.lines(Paths.get(data.txt); Pattern regex = Pattern.compile(“([\\d{1,3}]),(.*)”); List result = lines.map(regex::matcher) .filter(Matcher::find) .map(m -> new MyClass(m.group(1), m.group(2)) //MyClass(int id, String text) .collect(Collectors.toList()); 这将返回已处理的MyClass列表。 可以并行运行,一切正常。 问题是我现在有这个: data2.txt 101, “some text the text continues in the next line and maybe in the next” […]

Java 8超级类流,父文件,组件父项,链表等

我想将以下for语句转换for Java 8流(即Stream<Class> )。 理想的解决方案很简单,我可以轻松地适应各种遍历链表的情况(例如File.getParentFile() , Component.getParent() )。 Class clazz; Object value; value = …; for (clazz = value.getClass(); clazz != null; clazz = clazz.getSuperclass()) … 我意识到创建流的几行代码不会比单个for语句简单。 但是,流使for循环的主体更简单,因此需要流。