Я хочу реорганизовать приведенный ниже код, используя Javastream().
public String before(String input) {
if (input.contains("to for loop")) {
String[] splitBySpace = input.split(" ");
for (String s : splitBySpace) {
if (s.contains("a:")) {
String[] anotherSplit = s.split(":");
return anotherSplit[1];
}
}
}
return null;
}
public String after(String input) {
if (input.contains("to for loop")) {
String[] splitBySpace = input.split(" ");
return Arrays.stream(splitBySpace)
.filter(oneSplit -> oneSplit.contains("a:"))
.map(oneContains -> oneContains.split(";")[1])
.findFirst();
}
return null;
}
К сожалению, реорганизованный метод выдает необязательное значение String вместо String, и его невозможно скомпилировать.
Каков правильный метод рефакторинга с использованием потока Java?
проверьте документацию Optional: например. или Еще |-| не уверен, нравится ли мне такое смешанное решение (непотоковое и потоковое)




В этом случае поток кажется правильным, однако метод findFirst() имеет необязательный тип возвращаемого значения. Что вы можете сделать, это:
Звучит неплохо, есть фрагмент?
Ваш ответ можно улучшить, добавив дополнительную вспомогательную информацию. Пожалуйста, отредактируйте , добавив дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа. Более подробную информацию о том, как писать хорошие ответы, вы можете найти в справочном центре.
findFirst возвращает Optional, чтобы обозначить тот факт, что поток может не содержать элементов, и в этом случае возвращаемый Optional пуст. Императивный код вернет null, если цикл for не обнаружит ни одной строки, содержащей a:. Таким образом, вы можете использовать orElse(null) для преобразования Optional<String> в String, где null возвращается, если Optional пусто.
return Arrays.stream(splitBySpace)
.filter(oneSplit -> oneSplit.contains("a:"))
.map(oneContains -> oneContains.split(";")[1])
.findFirst().orElse(null);
Также рассмотрите возможность преобразования всего этого метода в цепочку вызовов методов и возврата Optional<String> в конце вместо String, который может иметь значение null.
public Optional<String> after(String input) {
// use ofNullable to gracefully handle a null input
return Optional.ofNullable(input)
// this filter is analogous to the if statement
.filter(x -> x.contains("to for loop"))
.stream()
.flatMap(x -> Arrays.stream(x.split(" ")))
.filter(oneSplit -> oneSplit.contains("a:"))
.map(oneContains -> oneContains.split(";")[1])
.findFirst();
}
Распакуйте
OptionalчерезgetилиorElse.