运行findFirst()后恢复Java流的处理

qojgxg4l  于 2022-12-21  发布在  Java
关注(0)|答案(3)|浏览(223)

给定一个简单的字符串列表:

List<String> strings = Arrays.asList("Mary", "James", "Jim", "Camilla");

我想用anotherMethod()方法处理列表中的每一项,但是第一项应该由someMethod()额外处理。
我试过这样的方法:

List<String> strings = Arrays.asList("Mary", "James", "Jim", "Camilla");

var result = strings.stream()
     .findFirst()
     .map(myString -> someMethod(myString))
     // "resume" stream
     .map(myString -> anotherMethod(myString))
     .toList();

有没有办法使用Stream或类似的东西来处理这样的场景?

j8ag8udp

j8ag8udp1#

findFirst将流压缩为Optional<String>,并且没有要恢复的内容。

Optional<String> mary = Stream.of("Mary", "James", "Jim", "Camilla").findFirst();

是否要将流减少为只有一个元素?那么方法limit(1)可能就是您要查找的,然后将它与您skip(1)元素的副本连接。

List<String> strings = Arrays.asList("Mary", "James", "Jim", "Camilla");
List<String> result = Stream.concat(
      strings.stream()
        .limit(1)
        .map(this::someMethod),
      strings.stream()
        .skip(1))
    .map(this::anotherMethod))
    .toList();
chy5wohz

chy5wohz2#

您可以在索引上创建一个IntStream

IntStream.range(0, strings.size())
    .mapToObj(i -> {
        var s = strings.get(i);
        if (i == 0) s = someMethod(s);
        return anotherMethod(s);
    }).toList();
cgh8pdjw

cgh8pdjw3#

一个月

您使用findFirst()的想法完全可行。
我们可以对Optional结果应用map(),并使用Java 9 Optional.stream()(以"恢复"流)。
结合Stream.concat()flatMap()操作对于将流的第一个元素与其余部分组合将是方便的。
应用最终转换并将结果收集到一个列表中。

List<String> strings = Arrays.asList("Mary", "James", "Jim", "Camilla");

List<String> result = strings.stream().findFirst()
    .map(MyClass::someMethod)
    .stream()
    .flatMap(s -> Stream.concat(Stream.of(s), strings.stream().skip(1)))
    .map(MyClass::anotherMethod)
    .toList();

∮ ∮ ∮
另一种选择是使用Java 8 Iterator.forEachRemaining()

List<String> strings = Arrays.asList("Mary", "James", "Jim", "Camilla");
List<String> result = new ArrayList<>();

Iterator<String> iterator = strings.iterator();
result.add(anotherMethod(someMethod(iterator.next())));
iterator.forEachRemaining(s -> result.add(anotherMethod(s));

相关问题