我想处理XML
java对象中的列表.我必须确保按顺序处理所有元素.
因此sequential
,stream
我应该每次使用我吗?
list.stream().sequential().filter().forEach()
或者只要我不使用并行性就足以使用流?
list.stream().filter().forEach()
我已经阅读过这个和这个问题,但仍然怀疑Stream.skip
JDK作者是否打算观察到这种行为.
让我们简单输入数字1..20:
List<Integer> input = IntStream.rangeClosed(1, 20).boxed().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
现在让我们创建一个并行流,以不同的方式结合unordered()
使用skip()
并收集结果:
System.out.println("skip-skip-unordered-toList: "
+ input.parallelStream().filter(x -> x > 0)
.skip(1)
.skip(1)
.unordered()
.collect(Collectors.toList()));
System.out.println("skip-unordered-skip-toList: "
+ input.parallelStream().filter(x -> x > 0)
.skip(1)
.unordered()
.skip(1)
.collect(Collectors.toList()));
System.out.println("unordered-skip-skip-toList: "
+ input.parallelStream().filter(x -> x > 0)
.unordered()
.skip(1)
.skip(1)
.collect(Collectors.toList()));
Run Code Online (Sandbox Code Playgroud)
过滤步骤在这里基本没什么,但为流引擎增加了更多的难度:现在它不知道输出的确切大小,因此关闭了一些优化.我有以下结果:
skip-skip-unordered-toList: [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
// absent values: 1, 2
skip-unordered-skip-toList: …
Run Code Online (Sandbox Code Playgroud) 在对JavaDoc中findFirst
说,如果流有一个邂逅的命令,那么第一个元素总是会返回,但如果流没有遭遇订单,可以返回的任何元素.
我试图演示它如何在没有遭遇顺序的流上工作,但我不能让它返回除了实际的第一个元素之外的任何东西.
我尝试将元素添加到a Set
,它没有定义的遭遇顺序:
Set<String> words = new HashSet<>();
words.addAll(Arrays.asList("this", "is", "a", "stream", "of", "strings"));
Optional<String> firstString = words.stream()
.findFirst();
System.out.println(firstString);
Run Code Online (Sandbox Code Playgroud)
每次我跑,我得到a
第一个字符串.然后我试图做一个Collections.shuffle
关于List
它添加到之前Set
,但这并没有改变任何东西.
List<String> wordList = Arrays.asList("this", "is", "a", "stream", "of", "strings");
words = new HashSet<>();
words.addAll(wordList);
firstString = words.stream()
.findFirst();
System.out.println(firstString);
Run Code Online (Sandbox Code Playgroud)
我a
每次都会回复这个词.
然后我尝试使用unordered
from方法BaseStream
,声称返回没有遇到顺序的流,但没有区别:
firstString = Stream.of("this", "is", "a", "stream", "of", "strings")
.unordered()
.findFirst();
System.out.println(firstString);
Run Code Online (Sandbox Code Playgroud)
现在我this
每次都得到这个词.我错过了什么吗?有没有办法证明findFirst
在无序流上返回不同的值?
排序操作的文档说:
对于有序流,排序是稳定的。对于无序流,没有稳定性保证。
和页面总结说:
一些中间操作,例如 sorted(),可能会强加遇到顺序
有人可以解释为什么sorted
操作需要对 Stream 的遇到顺序(我没有看到遇到顺序的存在与排序操作之间的关系)?
这是否意味着以下代码无效(因为 HashSet 不是本质上有序的)?
Set<Integer> mySet = new HashSet<>();
mySet.add(10);
mySet.add(4);
mySet.add(20);
mySet.add(15);
mySet.add(22);
mySet.add(-3);
List<Integer> result = mySet.stream().sorted().collect(Collectors.toList());
System.out.println(result);
Run Code Online (Sandbox Code Playgroud)
当我运行这段代码时,它总是给我相同的输出 [-3, 4, 10, 15, 20, 22]
事件如果我使用.parrallel()
,输出保持不变[-3, 4, 10, 15, 20, 22]
mySet.stream().parallel().sorted().collect(Collectors.toList());`
Run Code Online (Sandbox Code Playgroud) 我已经通过像前几次问题了在Java流相遇为了保鲜,这个答案Brian Goetz撰写,还有的javadoc的Stream.reduce(),和java.util.stream包的javadoc,但我仍然可以” t掌握以下内容:
采取这段代码:
public static void main(String... args) {
final String[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
System.out.println("Alphabet: ".concat(Arrays.toString(alphabet)));
System.out.println(new HashSet<>(Arrays.asList(alphabet))
.parallelStream()
.unordered()
.peek(System.out::println)
.reduce("", (a,b) -> a + b, (a,b) -> a + b));
}
Run Code Online (Sandbox Code Playgroud)
为什么减少总是*保留相遇顺序?
String[] stringArray = streamString.toArray(size -> new String[size]);
Run Code Online (Sandbox Code Playgroud)
如何自动将大小视为流的大小?