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

Rob*_*uch 4 java findfirst java-stream option-type

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

List<String> strings = Arrays.asList("Mary", "James", "Jim", "Camilla");
Run Code Online (Sandbox Code Playgroud)

我想用一种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();     
Run Code Online (Sandbox Code Playgroud)

有没有办法使用 aStream或类似的东西来处理这种情况?


更新1

这是一个例子,可以帮助您更好地理解我的问题背后的动机。

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

public String someMethod(String s) {
  return s.toUpperCase();
}

public String anotherMethod(String s) {
  return s.toLowerCase();
}
Run Code Online (Sandbox Code Playgroud)

最终结果为a List<String>,其中包含以下元素,即仅将第一个元素转换为大写,其他元素全部转换为小写。

"MARY", "james", "jim", "camilla"

Val*_*ler 5

findFirst将流折叠为 an Optional<String>,并且没有任何内容可以恢复。

Optional<String> mary = Stream.of("Mary", "James", "Jim", "Camilla").findFirst();
Run Code Online (Sandbox Code Playgroud)

您想将流减少到只有一个元素吗?那么该方法可能就是您正在寻找的方法,然后将其与元素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();
Run Code Online (Sandbox Code Playgroud)

编辑:更新1后:

您不想toLowerCase()在应用后应用到第一个元素toUpperCase()