Ale*_*lex 5 java foreach iterator return java-8
简化代码如下.我预计迭代内部的返回将导致跳出该方法.相反,代码执行下一次迭代,然后在方法内迭代后执行打印
public static void callIter() {
List<String> names = new ArrayList<>();
names.add("A");
names.add("B");
names.add("C");
ListIterator<String> nameIterator = names.listIterator();
nameIterator.forEachRemaining(name -> {
if (name.equals("B")) {
System.out.println("Found");
return;
}
System.out.println(name);
});
System.out.println("AfterIter");
}
Run Code Online (Sandbox Code Playgroud)
该return被用于迭代的每个(剩余)元件执行的代码的执行结束.它不会停止执行迭代/ forEachRemaining.这与您描述的行为相匹配.
对每个剩余元素执行给定操作,直到处理完所有元素或操作引发异常.如果指定了该顺序,则按迭代顺序执行操作.操作抛出的异常会转发给调用者.
换句话说,如果您不想滥用此异常,forEachRemaining则在处理最后一个元素之前,如果您打算停止迭代,则不应使用.
该forEach方法,无论是Iterable.forEach,Iterator.forEachRemaining还是Stream.forEach打算做什么顾名思义,申请诉讼,要求每一个元素,而不仅仅是一些.
停止迭代并不是这个API所预见的,可以通过查看Consumer接口的功能签名来识别,这(T) -> void不会使集合或迭代器注意到停止条件.
在这个地方,您应该重新考虑是否使用正确的工具来完成工作.比较您的方法,例如
List<String> names = Arrays.asList("A", "B", "C");
int ix = names.indexOf("B");
(ix<0? names: names.subList(0, ix)).forEach(System.out::println);
if(ix>=0) System.out.println("Found");
System.out.println("AfterIter");
Run Code Online (Sandbox Code Playgroud)
当然,如果元素的打印仅用于调试目的,则实际操作简化为
List<String> names = Arrays.asList("A", "B", "C");
if(names.contains("B")) System.out.println("Found");
System.out.println("AfterIter");
Run Code Online (Sandbox Code Playgroud)
如果相等只是任意谓词的占位符,则可以使用
List<String> names = Arrays.asList("A", "B", "C");
if(names.stream().anyMatch(s -> s.equals("B"))) System.out.println("Found");
System.out.println("AfterIter");
Run Code Online (Sandbox Code Playgroud)
它可以适应任意条件.
这可以扩展到
List<String> names = Arrays.asList("A", "B", "C");
Optional<String> match = names.stream()
.peek(System.out::println)
.filter(Predicate.isEqual("B"))
.findFirst();
if(match.isPresent()) System.out.println("Found");
// or
match.ifPresent(s -> System.out.println("Found "+s));
System.out.println("AfterIter");
Run Code Online (Sandbox Code Playgroud)
显示,如何通过打印元素来调试处理,表达等式谓词的另一种方法(仍然可以被其他谓词替换),以及如何获得非平凡谓词的实际匹配元素.
通常,如果要使用Java 8的新API,请不要尝试编写逻辑forEach.相反,尽量避免forEach使用更合适的操作.
| 归档时间: |
|
| 查看次数: |
733 次 |
| 最近记录: |