Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将此代码转换为Java8流API?_Java_List_Java 8_Java Stream - Fatal编程技术网

如何将此代码转换为Java8流API?

如何将此代码转换为Java8流API?,java,list,java-8,java-stream,Java,List,Java 8,Java Stream,我想使用Java8流将这个while循环转换为等效的代码,但是我不知道如何流化列表并从中删除元素 private List<String> nameList = new ArrayList<>(); while (nameList.size() > 0) { String nameListFirstEntry = nameList.get(0); nameList.remove(0); setNameCombinations(nameLis

我想使用Java8
流将这个while循环转换为等效的代码,但是我不知道如何流化
列表
并从中删除元素

private List<String> nameList = new ArrayList<>();

while (nameList.size() > 0) {
    String nameListFirstEntry = nameList.get(0);
    nameList.remove(0);
    setNameCombinations(nameListFirstEntry);
}
private List name List=new ArrayList();
while(nameList.size()>0){
字符串nameListFirstEntry=nameList.get(0);
名称列表。删除(0);
SetNameCompositions(nameListFirstEntry);
}
因为还返回元素,所以您既可以流式处理列表的元素,也可以通过流删除它们:

Stream.generate(() -> nameList.remove(0))
    .limit(nameList.size())
    .forEach(this::setNameCombinations);
此代码不会违反任何“规则”。从以下文件的javadoc:

返回无限顺序无序流,其中每个元素由提供的供应商生成。这适用于生成恒定流、随机元素流等

未提及对供应商实施方式的任何限制,或不得有任何副作用等。供应商的唯一合同是供应


对于那些怀疑这是否“有效”的人,这里有一些使用100K元素的测试代码,显示确实保留了顺序:

int size = 100000;
List<Integer> list0 = new ArrayList<>(size); // the reference list
IntStream.range(0, size).boxed().forEach(list0::add);
List<Integer> list1 = new ArrayList<>(list0); // will feed stream
List<Integer> list2 = new ArrayList<>(size);  // will consume stream

Stream.generate(() -> list1.remove(0))
        .limit(list1.size())
        .forEach(list2::add);

System.out.println(list0.equals(list2)); // always true
int size=100000;
List list0=新阵列列表(大小);//参考列表
IntStream.range(0,size).boxed().forEach(list0::add);
List list1=新阵列列表(list0);//将给水流供水
List list2=新阵列列表(大小);//将消耗流
Stream.generate(()->list1.remove(0))
.limit(list1.size())
.forEach(列表2::添加);
System.out.println(list0.equals(list2));//永远正确
我想这样就可以了

nameList.forEach(this::setNameCombinations);
nameList.clear();

如果您不再需要原始列表,不妨创建一个新的空列表。

将其转换为什么?SQL?COBOL?Pascal?这已经是有效的Java8代码(尽管我不知道它做什么以及为什么做)。在java-8流或ForEach中,您的代码试图做什么?什么是
SetNameCompositions
?streams和
forEach
都不允许修改源列表,因此您在转换失败时运气不佳。@Eugene,所以不要添加
parallel()
。它不是“非法的”,甚至不是神秘的。它正在使用
List#remove()
作为流的供应商。。。了不起的事如果您有疑问,请自己尝试。@eugene让我们在这里直截了当地说:这段代码不会对列表进行流式处理,流也不会修改任何内容。供应商在供应过程中对某些东西进行了变异,但流不知道或不关心供应商如何供应。这里没有任何东西会违反任何指导原则或合同。@Eugene为什么你认为添加并行会得到相同的结果?它在哪里说的?我可以告诉你,添加并行通常会改变结果——也就是说,如果特定流支持并行,那么流中元素的相遇顺序将变得不确定(例如,如果列表不支持并行,则流)。假设
nameList
由3个元素组成
[a,b,c]
;通过相同的结果,我希望看到这3个元素以任何顺序排列(因为它是并行的)@M.Prokhorov这没关系。没有从列表中填充需求流并删除元素。好吧,迭代和删除是两个独立的问题,我想知道为什么在同一个流中必须满足这两个问题?实际问题是“使用流api将while循环转换为等效代码”,现在就到了。你从来没有要求在同一条流中做这件事。。。无论如何,我怀疑这是一个合理的要求(尽管我不得不承认波希米亚的方法非常有趣),你是对的,但问题也表明,但我不知道如何流式处理列表和从列表中删除元素。是的,同意。他的解决方案很聪明,完全符合要求。尽管如此,这些要求(约束)还是毫无意义的。这是一个理论上的例子,你认为“很高兴知道,但在实践中永远不要这样做”;)@Gerald您认为流不应该修改源代码是正确的,但我的代码中并没有这样做。我的答案中的流不会修改源。供应商有,这是完全不同的。流代码是确定性的,并且遵循指导原则。供应商代码很简单,甚至可以使用方法引用,但代码更简洁。