Streamsorted()导致意外结果
我有一个数组和一个如下所示的流。
String[] names = {"Alex", "Anna", "Abhi", "Some", "Broad", "Dustin",
"amanda", "Hanna", "Steve", "Sydney"};
Stream.of(names)
.sorted()
.map(String::toLowerCase)
.filter(x -> x.startsWith("a"))
.forEachOrdered(System.out::println);
//I have also tried - .forEach(System.out::println);
实际输出:
abhi
alex
anna
amanda
预期输出:
abhi
alex
amanda
anna
abhi
alex
amanda
anna
我在这里缺少什么?
回答
您首先进行排序,然后才对toLowerCase元素应用 ,因为Anna资本A会在amanda.
请改为执行以下操作:
Stream.of(names)
.map(String::toLowerCase)
.filter(x -> x.startsWith("a"))
.sorted()
.forEachOrdered(System.out::println);
输出:
回答
您错过了.sorted()之前的调用forEachOrdered,否则应用后流的内容将不会被排序.toLowerCase()。
什么forEachOrdered是按照它们在流中的顺序在流中的每个项目上运行一个函数;它不会对值本身进行排序。
- @RobertHarvey It has an effect, but not the desired one, since it sorts uppercase letters before lowercase letters.
- @AjayKumar Go for dreamcash's answer: theirs explains why `.sorted()` doesn't work as expected.