在下面的示例中如何使用lambda表达式和流?

在下面的示例中如何使用lambda表达式和流?,lambda,java-8,java-stream,sikuli,Lambda,Java 8,Java Stream,Sikuli,如何使用lambda表达式编写以下过程,以及如何使用流编写它 Screen myScreen = new Screen(); Pattern myPattern = new Pattern("img.png"); Iterator<Match> it = myScreen.findAll(myPattern); while (it.hasNext()) it.next().click(); Screen myScreen=新屏幕(); 模式myPattern=新模式(

如何使用lambda表达式编写以下过程,以及如何使用流编写它

Screen myScreen = new Screen();
Pattern myPattern = new Pattern("img.png");

Iterator<Match> it = myScreen.findAll(myPattern);
  while (it.hasNext())
    it.next().click();
Screen myScreen=新屏幕();
模式myPattern=新模式(“img.png”);
迭代器it=myScreen.findAll(myPattern);
while(it.hasNext())
单击();
您可以使用utils来实现这一点。例如:

Iterator<Match> matches = s.findAll("someImage.png");
List<Match> list = IteratorUtils.toList(matches);
list.stream().forEach(Match::highlight);
 Iterator<Integer> iter = List.of(1, 2, 3, 4).iterator();

 Stream<Integer> stream = Stream.iterate(iter.next(),
                   i -> iter.hasNext(), 
                   i -> iter.next()); 
     stream.forEach(System.out::println); // prints [1,2,3]
迭代器匹配=s.findAll(“someImage.png”); List=IteratorUtils.toList(匹配项); list.stream().forEach(Match::highlight);
如果您真的想使用带有lambdas的流进行此操作,您必须首先将迭代器转换为流,然后您可以使用此流在对象上进行迭代,并使用方法引用调用它们的
单击
方法:

Iterator<Match> it = myScreen.findAll(myPattern);

// convert Iterator to Stream
Iterable<Match> iterable = () -> it;
Stream<Match> stream = StreamSupport.stream(iterable.spliterator(), false);

// invoke click on each object
stream.forEach(Match::click);

或者,在Java8中,
迭代器
接口有一个默认方法

那个可以解决你的问题,而不必求助于溪流。您可以简单地执行以下操作:

Iterator<Match> it = myScreen.findAll(myPattern);
it.forEachRemaining(Match::click);
Iterator it=myScreen.findAll(myPattern);
it.forEachRemaining(匹配::单击);
有一种方法可以使用流进行迭代,比如for循环或迭代器-通过
流进行迭代。
,但它将出现在jdk-9中。但它的使用并不是那么简单,因为它的行为完全像for循环,因此并不完全符合您的预期。例如:

Iterator<Match> matches = s.findAll("someImage.png");
List<Match> list = IteratorUtils.toList(matches);
list.stream().forEach(Match::highlight);
 Iterator<Integer> iter = List.of(1, 2, 3, 4).iterator();

 Stream<Integer> stream = Stream.iterate(iter.next(),
                   i -> iter.hasNext(), 
                   i -> iter.next()); 
     stream.forEach(System.out::println); // prints [1,2,3]

您是否在询问如何从迭代器创建流。如果不是,我们怎么知道屏幕类呢?是的,如何从迭代器创建流,或者如何使用lambda表达式代替while循环。然后单击我发布的链接(我通过谷歌搜索“transform iterator to stream”找到)。谷歌是你的朋友。使用它。您似乎对lambda表达式感到困惑。它们不是循环的替代品。
default void forEachRemaining(Consumer<? super E> action) {
    Objects.requireNonNull(action);
    while (hasNext())
        action.accept(next());
}