Questions tagged «java-stream»

将此标签用于与使用Stream API有关的问题。它是Java 8中引入的,支持对值流的功能样式操作,例如集合上的filter-map-reduce管道。

21
Java 8 List <V>到Map <K,V>
我想使用Java 8的流和lambda将对象列表转换为Map。 这就是我在Java 7及以下版本中编写它的方式。 private Map&lt;String, Choice&gt; nameMap(List&lt;Choice&gt; choices) { final Map&lt;String, Choice&gt; hashMap = new HashMap&lt;&gt;(); for (final Choice choice : choices) { hashMap.put(choice.getName(), choice); } return hashMap; } 我可以使用Java 8和Guava轻松完成此操作,但我想知道如何在没有Guava的情况下执行此操作。 在番石榴: private Map&lt;String, Choice&gt; nameMap(List&lt;Choice&gt; choices) { return Maps.uniqueIndex(choices, new Function&lt;Choice, String&gt;() { @Override public String apply(final Choice …



6
如果可能,是否应该始终使用并行流?
使用Java 8和lambda,可以很容易地将集合作为流进行迭代,也很容易使用并行流。docs中的两个示例,第二个示例使用parallelStream: myShapesCollection.stream() .filter(e -&gt; e.getColor() == Color.RED) .forEach(e -&gt; System.out.println(e.getName())); myShapesCollection.parallelStream() // &lt;-- This one uses parallel .filter(e -&gt; e.getColor() == Color.RED) .forEach(e -&gt; System.out.println(e.getName())); 只要我不关心顺序,使用并行会一直有益吗?有人会认为,更快地将工作划分到更多的内核上。 还有其他考虑事项吗?什么时候应该使用并行流,什么时候应该使用非并行流? (问这个问题引发了关于如何以及何时使用并行流的讨论,不是因为我认为始终使用并行流是一个好主意。)

6
通过谓词查找第一个元素
我刚刚开始使用Java 8 lambda,并且正在尝试实现一些我在函数式语言中惯用的东西。 例如,大多数功能语言都具有某种对序列进行操作的find函数,或者对返回谓词为的第一个元素的列表进行操作true。我看到的在Java 8中实现此目标的唯一方法是: lst.stream() .filter(x -&gt; x &gt; 5) .findFirst() 但是,这对我来说似乎效率很低,因为过滤器将扫描整个列表,至少在我看来(可能是错误的)。有没有更好的办法?
504 java  java-8  java-stream 

8
Java 8 Iterable.forEach()与foreach循环
Java 堆栈:Java 8:чтолучше? 以下哪个是Java 8中的最佳实践? Java 8: joins.forEach(join -&gt; mIrc.join(mSession, join)); Java 7: for (String join : joins) { mIrc.join(mSession, join); } 我有很多可以用lambda简化的for循环,但是使用它们真的有任何优势吗?会提高其性能和可读性吗? 编辑 我还将这个问题扩展到更长的方法。我知道您无法从lambda返回或中断父函数,在比较它们时也应考虑到这一点,但是还有其他需要考虑的地方吗?

26
Java 8按属性区分
在Java 8中,如何Stream通过检查每个对象的属性的不同性来使用API 过滤集合? 例如,我有一个Person对象列表,我想删除同名的人, persons.stream().distinct(); 将对对象使用默认的相等性检查Person,所以我需要类似的东西, persons.stream().distinct(p -&gt; p.getName()); 不幸的是,该distinct()方法没有这样的重载。如果不修改Person类内部的相等性检查,是否可以简洁地做到这一点?

14
从Java 8中的java.util.stream.Stream检索列表
我在玩Java 8 lambda来轻松过滤集合。但是我没有找到一种简洁的方法来在同一条语句中以新列表的形式检索结果。到目前为止,这是我迄今为止最简洁的方法: List&lt;Long&gt; sourceLongList = Arrays.asList(1L, 10L, 50L, 80L, 100L, 120L, 133L, 333L); List&lt;Long&gt; targetLongList = new ArrayList&lt;&gt;(); sourceLongList.stream().filter(l -&gt; l &gt; 100).forEach(targetLongList::add); 网上的示例没有回答我的问题,因为它们停止了而没有生成新的结果列表。必须有一种更简洁的方法。我本来期望的是,Stream类有方法为toList(),toSet(),... 有没有办法targetLongList可以由第三行直接分配变量?


14
Java 8并行流中的自定义线程池
是否可以为Java 8 并行流指定自定义线程池?我在任何地方都找不到。 假设我有一个服务器应用程序,并且想使用并行流。但是该应用程序很大且是多线程的,因此我想将其划分。我不希望一个模块中的某个模块中的任务运行缓慢,而另一个模块中的任务却运行缓慢。 如果不能为不同的模块使用不同的线程池,则意味着在大多数实际情况下,我不能安全地使用并行流。 请尝试以下示例。在单独的线程中执行一些CPU密集型任务。任务利用并行流。第一个任务已中断,因此每个步骤需要1秒钟(由线程睡眠模拟)。问题是其他线程被卡住并等待中断的任务完成。这是一个人为的示例,但是假设有一个servlet应用程序,有人向共享的fork联接池提交了一个长时间运行的任务。 public class ParallelTest { public static void main(String[] args) throws InterruptedException { ExecutorService es = Executors.newCachedThreadPool(); es.execute(() -&gt; runTask(1000)); //incorrect task es.execute(() -&gt; runTask(0)); es.execute(() -&gt; runTask(0)); es.execute(() -&gt; runTask(0)); es.execute(() -&gt; runTask(0)); es.execute(() -&gt; runTask(0)); es.shutdown(); es.awaitTermination(60, TimeUnit.SECONDS); } private static void runTask(int …

22
在Java 8中,有没有一种简洁的方法可以迭代带有索引的流?
是否有一种简洁的方法可以在访问流中的索引的同时对流进行迭代? String[] names = {"Sam","Pamela", "Dave", "Pascal", "Erik"}; List&lt;String&gt; nameList; Stream&lt;Integer&gt; indices = intRange(1, names.length).boxed(); nameList = zip(indices, stream(names), SimpleEntry::new) .filter(e -&gt; e.getValue().length() &lt;= e.getKey()) .map(Entry::getValue) .collect(toList()); 与那里给出的LINQ示例相比,这似乎令人失望 string[] names = { "Sam", "Pamela", "Dave", "Pascal", "Erik" }; var nameList = names.Where((c, index) =&gt; c.Length &lt;= index + 1).ToList(); 有没有更简洁的方法? …
382 java  java-8  java-stream 


12
Collectors.toMap中的Java 8 NullPointerException
如果其中一个值为“ null”,则Java 8 Collectors.toMap会抛出a NullPointerException。我不了解这种行为,地图可以包含空指针作为值,而没有任何问题。是否有充分的理由为什么值不能为null Collectors.toMap? 另外,是否有解决此问题的不错的Java 8方法,还是我应该还原为普通的for循环? 我的问题的一个例子: import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; class Answer { private int id; private Boolean answer; Answer() { } Answer(int id, Boolean answer) { this.id = id; this.answer = answer; } public int getId() { return id; } public void …


17
如何从Java 8流中引发CHECKED异常?
如何从Java 8流/ lambda中抛出CHECKED异常? 换句话说,我想使代码像这样编译: public List&lt;Class&gt; getClasses() throws ClassNotFoundException { List&lt;Class&gt; classes = Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String") .map(className -&gt; Class.forName(className)) .collect(Collectors.toList()); return classes; } 该代码无法编译,因为Class.forName()上面的方法抛出ClassNotFoundException,因此。 请注意,我不想将已检查的异常包装在运行时异常中,而是抛出已包装的未检查的异常。我想抛出被检查的异常本身,而又不添加丑陋的try/ catches流。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.