Questions tagged «java-stream»

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

4
为什么在Java 8中转换类型的reduce方法需要组合器
我无法完全理解combinerStreams reduce方法中扮演的角色。 例如,以下代码不会编译: int length = asList("str1", "str2").stream() .reduce(0, (accumulatedInt, str) -> accumulatedInt + str.length()); 编译错误说:( 参数不匹配; int无法转换为java.lang.String) 但是这段代码可以编译: int length = asList("str1", "str2").stream() .reduce(0, (accumulatedInt, str ) -> accumulatedInt + str.length(), (accumulatedInt, accumulatedInt2) -> accumulatedInt + accumulatedInt2); 我知道合并器方法用于并行流中,因此在我的示例中将两个中间累积的int加在一起。 但是我不明白为什么第一个示例没有组合器就无法编译,或者组合器是如何将字符串转换为int的,因为它只是将两个int加在一起。 谁能阐明这一点?
141 java  java-8  java-stream 

4
Java 8:Streams与Collections的性能
我是Java 8的新手。我仍然不了解API的详细信息,但是我做了一个小型的非正式基准测试,以比较新Streams API与旧版Collections的性能。 该测试包括过滤的列表Integer,并针对每个偶数计算平方根并将其存储在结果List中Double。 这是代码: public static void main(String[] args) { //Calculating square root of even numbers from 1 to N int min = 1; int max = 1000000; List<Integer> sourceList = new ArrayList<>(); for (int i = min; i < max; i++) { sourceList.add(i); } List<Double> result = new …

7
在Java 8中,如何使用lambda将Map <K,V>转换为另一个Map <K,V>?
我刚刚开始研究Java 8,并尝试了lambda,我认为我想尝试重写最近写的一件非常简单的东西。我需要将字符串映射到列映射转换为另一个字符串映射到列映射,其中新映射中的列是第一个映射中列的防御性副本。列具有复制构造函数。到目前为止,我最接近的是: Map&lt;String, Column&gt; newColumnMap= new HashMap&lt;&gt;(); originalColumnMap.entrySet().stream().forEach(x -&gt; newColumnMap.put(x.getKey(), new Column(x.getValue()))); 但我敢肯定,必须有更好的方法来完成这项工作,对于您的建议我将不胜感激。
140 java  map  lambda  java-8  java-stream 

6
在Java流中,peek真的仅用于调试吗?
我正在阅读有关Java流的信息,并在不断学习中发现新事物。我发现的新peek()功能之一就是功能。我偷看的几乎所有内容都说应将其用于调试Streams。 如果我有一个Stream,其中每个帐户都有一个用户名,密码字段以及一个login()和LoggedIn()方法,该怎么办? 我也有 Consumer&lt;Account&gt; login = account -&gt; account.login(); 和 Predicate&lt;Account&gt; loggedIn = account -&gt; account.loggedIn(); 为什么会这么糟糕? List&lt;Account&gt; accounts; //assume it's been setup List&lt;Account&gt; loggedInAccount = accounts.stream() .peek(login) .filter(loggedIn) .collect(Collectors.toList()); 现在,据我所知,这确实可以实现预期的目的。它; 取得帐户清单 尝试登录每个帐户 过滤掉所有未登录的帐户 将已登录的帐户收集到新列表中 这样做的缺点是什么?有什么我不应该继续的理由吗?最后,如果不是这种解决方案,那又如何呢? 它的原始版本使用.filter()方法,如下所示; .filter(account -&gt; { account.login(); return account.loggedIn(); })
137 java  java-8  java-stream  peek 

1
如何使用Java 8 Stream从某些类属性获取列表?
我有一个List&lt;Person&gt;。我需要List从的属性获得Person。 例如,我有一个Person课: class Person { private String name; private String birthDate; public String getName() { return name; } public String getBirthDate() { return birthDate; } Person(String name) { this.name = name; } } List&lt;Person&gt; personList = new ArrayList&lt;&gt;(); personList.add(new Person("David")); personList.add(new Person("Joe")); personList.add(new Person("Michel")); personList.add(new Person("Barak")); 我想使用StreamAPI 获取名称列表,如下所示: List&lt;String&gt; names …


5
在Java中,流比循环有什么优势?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 3年前关闭。 改善这个问题 面试中有人问我这个问题,但我不相信我给出了我能提供的最佳答案。我提到您可以进行并行搜索,并且空值是通过某种我不记得的方式处理的。现在,我意识到我在考虑选修课。我在这里想念什么?他们声称这是更好或更简洁的代码,但我不确定我是否同意。 考虑到答案的简洁程度,看来这毕竟不是一个太宽泛的问题。 如果他们在面试中提出这个问题,而且很明显,将其分解除了能使找到答案变得更加困难之外,还有什么目的?我的意思是,你在找什么?我可以分解问题,让所有子问题都得到回答,但是然后创建一个带有所有子问题链接的父问题……虽然看起来很愚蠢。在讨论过程中,请举例说明一个不太广泛的问题。我不知道只问这个问题的一部分,仍然会得到有意义的答案。我可以用不同的方式问同样的问题。例如,我可以问“流的作用是什么?” 或“何时使用流而不是for循环?” 或“为什么要麻烦流而不是for循环?” 这些都是完全相同的问题。 ...还是因为有人给出了很长的多点答案而被认为过于宽泛?坦率地说,任何有知识的人都可以解决任何问题。例如,如果您碰巧是JVM的作者之一,那么您可能可能整天都在谈论for循环,而我们大多数人却不能。 “请编辑问题以将其限制在一个特定的问题上,并要有足够的细节来确定适当的答案。避免一次提出多个不同的问题。请参阅“如何提出问题”页面,以帮助您弄清这个问题。” 如下所述,已经给出了足够的答案,证明存在一个答案,并且很容易提供。

10
复制流,以避免“流已被操作或关闭”
我想复制一个Java 8流,以便可以处理两次。我可以collect列出并从中获得新的信息流; // doSomething() returns a stream List&lt;A&gt; thing = doSomething().collect(toList()); thing.stream()... // do stuff thing.stream()... // do other stuff 但是我认为应该有一种更有效/更优雅的方法。 有没有一种方法可以复制流而不将其转换为集合? 我实际上正在使用Eithers 流,因此想要先处理左侧投影,然后再移至右侧投影并以另一种方式处理。有点像这样(到目前为止,我被迫使用这种toList技巧)。 List&lt;Either&lt;Pair&lt;A, Throwable&gt;, A&gt;&gt; results = doSomething().collect(toList()); Stream&lt;Pair&lt;A, Throwable&gt;&gt; failures = results.stream().flatMap(either -&gt; either.left()); failures.forEach(failure -&gt; ... ); Stream&lt;A&gt; successes = results.stream().flatMap(either -&gt; either.right()); successes.forEach(success -&gt; ... …


3
获取符合条件的第一个元素
如何获取与流中的条件匹配的第一个元素?我已经尝试过了但是没用 this.stops.stream().filter(Stop s-&gt; s.getStation().getName().equals(name)); 该条件不起作用,在除Stop之外的其他类中调用filter方法。 public class Train { private final String name; private final SortedSet&lt;Stop&gt; stops; public Train(String name) { this.name = name; this.stops = new TreeSet&lt;Stop&gt;(); } public void addStop(Stop stop) { this.stops.add(stop); } public Stop getFirstStation() { return this.getStops().first(); } public Stop getLastStation() { return this.getStops().last(); } …
121 java  java-8  java-stream 

6
单行获取Stream / List的最后一个元素
如何在以下代码中获取流或列表的最后一个元素? 哪里data.careas是List&lt;CArea&gt;: CArea first = data.careas.stream() .filter(c -&gt; c.bbox.orientationHorizontal).findFirst().get(); CArea last = data.careas.stream() .filter(c -&gt; c.bbox.orientationHorizontal) .collect(Collectors.toList()).; //how to? 如您所见,获得第一个元素一定filter并不困难。 但是,获得单线的最后一个要素确实是一个痛苦: 看来我无法直接从Stream。(仅对有限的流有意义) 这似乎也不能得到像first()和last()从List接口,这实在是一种痛苦。 我看不到在接口中不提供first()and last()方法的任何参数List,因为其中的元素是有序的,而且大小是已知的。 但是按照原始答案:如何获得有限的最后一个元素Stream? 就个人而言,这是我能得到的最接近的结果: int lastIndex = data.careas.stream() .filter(c -&gt; c.bbox.orientationHorizontal) .mapToInt(c -&gt; data.careas.indexOf(c)).max().getAsInt(); CArea last = data.careas.get(lastIndex); 但是,它确实涉及indexOf在每个元素上使用on,这通常是您通常不希望的,因为它会影响性能。
117 java  list  java-8  java-stream 


20
从流中收集连续对
给定流如 { 0, 1, 2, 3, 4 }, 如何最优雅地将其转换为给定形式: { new Pair(0, 1), new Pair(1, 2), new Pair(2, 3), new Pair(3, 4) } (当然,假设我已经定义了Pair类)? 编辑:这不完全是关于整数或原始流。对于任何类型的流,答案应该是通用的。
102 java  java-8  java-stream 

5
什么时候应该使用流?
使用a List及其stream()方法时,我刚遇到一个问题。虽然我知道如何使用它们,但是我不确定何时使用它们。 例如,我有一个列表,其中包含到不同位置的各种路径。现在,我想检查一个给定的路径是否包含列表中指定的任何路径。我想boolean根据是否满足条件返回一个。 当然,这本身并不是一项艰巨的任务。但是我想知道我应该使用流还是for(-each)循环。 名单 private static final List&lt;String&gt; EXCLUDE_PATHS = Arrays.asList(new String[]{ "my/path/one", "my/path/two" }); 示例-流 private boolean isExcluded(String path){ return EXCLUDE_PATHS.stream() .map(String::toLowerCase) .filter(path::contains) .collect(Collectors.toList()) .size() &gt; 0; } 示例-每次循环 private boolean isExcluded(String path){ for (String excludePath : EXCLUDE_PATHS) { if(path.contains(excludePath.toLowerCase())){ return true; } } return false; } 请注意,该path参数始终为小写。 …

9
Java 8中的多个空检查
我有下面的代码,对于多个空检查来说有点难看。 String s = null; if (str1 != null) { s = str1; } else if (str2 != null) { s = str2; } else if (str3 != null) { s = str3; } else { s = str4; } 因此,我尝试使用Optional.ofNullable如下所示的方法,但是如果有人阅读了我的代码,仍然很难理解。用Java 8最好的方法是什么 String s = Optional.ofNullable(str1) .orElse(Optional.ofNullable(str2) .orElse(Optional.ofNullable(str3) .orElse(str4))); 在Java …

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.