在下面的示例中如何使用lambda表达式和流?
如何使用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=新模式(
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());
}