Questions tagged «java-stream»

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

7
Java 8 Streams FlatMap方法示例
我一直在检查即将发生的情况Java update,即:Java 8 or JDK 8。是的,我不耐烦,有很多新东西,但是,有些我不理解的东西,一些简单的代码: final Stream<Integer>stream = Stream.of(1,2,3,4,5,6,7,8,9,10); stream.flatMap(); javadocs是 public <R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper) 返回一个流,该流包括将流中的每个元素替换为通过将提供的映射函数应用于每个元素而生成的映射流的内容而得到的结果。将每个映射流的内容放入此流后,将其关闭。(如果映射的流为null,则使用空流。)这是一个中间操作。 如果有人创建了一些简单的现实示例flatMap,我将不胜感激,您如何在以前的Java版本Java[6,7]中编写代码,以及如何使用编写相同的例程Java 8。

5
为什么Stream.allMatch()对于空流返回true?
我和我的同事有一个错误,这是由于我们假设allMatch()会返回空流调用而导致的false。 if (myItems.allMatch(i -> i.isValid()) { //do something } 当然,假设和不阅读文档是我们的错。但是我不明白的是为什么allMatch()空流的默认行为会返回true。这是什么原因呢?像anyMatch()(相反地返回false)一样,此操作以命令式使用,它离开了monad,并且可能在if语句中使用了。考虑到这些事实,是否有任何理由使大多数用途都需要allMatch()默认为true空流?

5
如何将Java 8流收集到Guava ImmutableCollection中?
我要执行以下操作: List<Integer> list = IntStream.range(0, 7).collect(Collectors.toList()); 但以某种方式得到的列表是Guava的实现ImmutableList。 我知道我能做 List<Integer> list = IntStream.range(0, 7).collect(Collectors.toList()); List<Integer> immutableList = ImmutableList.copyOf(list); 但我想直接收集。我试过了 List<Integer> list = IntStream.range(0, 7) .collect(Collectors.toCollection(ImmutableList::of)); 但它引发了一个例外: com.google.common.collect.ImmutableCollection.add(ImmutableCollection.java:96)上的java.lang.UnsupportedOperationException


10
Java 8:计算lambda迭代次数的首选方法?
我经常遇到同样的问题。我需要计算在Lambda之外使用的Lambda的运行次数。例如: myStream.stream().filter(...).forEach(item->{ ... ; runCount++); System.out.println("The lambda ran "+runCount+"times"); 问题是runCount必须是final,因此不能为int。它不能是整数,因为那是不可变的。我可以将其设置为类级别的变量(即字段),但是在此代码块中只需要它即可。我知道有各种各样的方法,我很好奇您对此的首选解决方案是什么?您是否使用AtomicInteger或数组引用或其他某种方式?

9
Java 8:使用换行符和缩进格式格式化lambda
我想通过lambda缩进实现以下内容: 多行语句: String[] ppl = new String[] { "Karen (F)", "Kevin (M)", "Lee (M)", "Joan (F)", "Des (M)", "Rick (M)" }; List<String> strings = Arrays.stream(ppl) .filter( (x) -> { return x.contains("(M)"); } ).collect(Collectors.toList()); strings.stream().forEach(System.out::println); 单行语句: List<String> strings = Arrays.stream(ppl) .map((x) -> x.toUpperCase()) .filter((x) -> x.contains("(M)")) .collect(Collectors.toList()); 当前,Eclipse将自动格式化为以下格式: 多行语句: String[] ppl …


3
Java 8:使用流API合并列表
我有以下情况 Map<Key, ListContainer> map; public class ListContainer{ List<AClass> lst; } 我必须合并所有列表 lst从ListContainer从对象Map地图。 public static void main(String args[]){ List<AClass> alltheObjectsAClass = map.values().stream(). // continue.... } 知道如何使用Java 8流API吗?


3
检查流中的instanceof
我有以下表达: scheduleIntervalContainers.stream() .filter(sic -> ((ScheduleIntervalContainer) sic).getStartTime() != ((ScheduleIntervalContainer)sic).getEndTime()) .collect(Collectors.toList()); ...其中scheduleIntervalContainers元素类型为ScheduleContainer: final List<ScheduleContainer> scheduleIntervalContainers 是否可以在过滤器之前检查类型?

3
Collectors.toMap()keyMapper —更简洁的表达吗?
我正在尝试在以下Collectors.toMap()调用中为“ keyMapper”函数参数提供一个更简洁的表达式: List<Person> roster = ...; Map<String, Person> map = roster .stream() .collect( Collectors.toMap( new Function<Person, String>() { public String apply(Person p) { return p.getLast(); } }, Function.<Person>identity())); 看来我应该能够使用lambda表达式内联它,但是我无法提出一个可以编译的表达式。(我对lambda很陌生,所以这并不奇怪。) 谢谢。 ->更新: 如已接受的答案中所述 Person::getLast 是我一直在寻找的东西,也是我尝试过的东西。但是,问题是夜间出现的Eclipse 4.3的BETA_8夜间构建-标记为错误。从命令行编译时(我应该在发布之前完成该工作)。因此,该到eclipse.org提交错误了。 谢谢。

1
Collectors.toSet()和HashSet
采取以下示例代码行: Set<String> someSet = someColletion.stream().map(p -> p.toString()).collect(Collectors.toSet()); 我想要一个HashSet。将调试器用于代码,我确实得到了HashSet。我看了看java.util.stream.Collectors.toSet()下面的代码: public static <T> Collector<T, ?, Set<T>> toSet() { return new CollectorImpl<>((Supplier<Set<T>>) HashSet::new, Set::add, (left, right) -> { left.addAll(right); return left; }, CH_UNORDERED_ID); } 合同担保a Set,实施决定a HashSet; 似乎是合理的。但是,我的实现需要aHashSet而不是仅任何old保证的恒定时间查找Set。如果的实现toSet()决定使用FooSet完全在其权限范围内的a ,则我的实现受到了损害。 解决此问题的最佳实践是什么?


4
takeWhile()与Flatmap的工作方式不同
我正在用takeWhile创建片段,以探索其可能性。当与flatMap结合使用时,其行为与预期不符。请在下面找到代码片段。 String[][] strArray = {{"Sample1", "Sample2"}, {"Sample3", "Sample4", "Sample5"}}; Arrays.stream(strArray) .flatMap(indStream -> Arrays.stream(indStream)) .takeWhile(ele -> !ele.equalsIgnoreCase("Sample4")) .forEach(ele -> System.out.println(ele)); 实际输出: Sample1 Sample2 Sample3 Sample5 预期输出: Sample1 Sample2 Sample3 期望的原因是takeWhile应该一直执行到内部条件变为真为止。我还在平面图中添加了打印输出语句以进行调试。流仅返回两次,这与期望一致。 但是,这在链中没有平面图的情况下也很好用。 String[] strArraySingle = {"Sample3", "Sample4", "Sample5"}; Arrays.stream(strArraySingle) .takeWhile(ele -> !ele.equalsIgnoreCase("Sample4")) .forEach(ele -> System.out.println(ele)); 实际输出: Sample3 此处,实际输出与预期输出匹配。 免责声明:这些摘录仅用于代码实践,不能用于任何有效的用例。 更新: 错误JDK-8193856:该修补程序将作为JDK 10的一部分提供。更改将更正whileOps …

7
为什么flatMap()之后的filter()在Java流中不是“完全”惰性的?
我有以下示例代码: System.out.println( "Result: " + Stream.of(1, 2, 3) .filter(i -> { System.out.println(i); return true; }) .findFirst() .get() ); System.out.println("-----------"); System.out.println( "Result: " + Stream.of(1, 2, 3) .flatMap(i -> Stream.of(i - 1, i, i + 1)) .flatMap(i -> Stream.of(i - 1, i, i + 1)) .filter(i -> { System.out.println(i); return true; …

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.