Я создаю фрагменты с takeWhile, чтобы исследовать его возможности. При использовании в сочетании с flatMap поведение не соответствует ожиданию. Ниже приведен фрагмент кода.
String[][] strArray = {{"Sample1", "Sample2"}, {"Sample3", "Sample4", "Sample5"}};
Arrays.stream(strArray)
.flatMap(indStream -> Arrays.stream(indStream))
.takeWhile(ele -> !ele.equalsIgnoreCase("Sample4"))
.forEach(ele -> System.out.println(ele));
Фактический выход:
Sample1
Sample2
Sample3
Sample5
ExpectedOutput:
Sample1
Sample2
Sample3
Причина ожидания заключается в том, что takeWhile должно выполняться до тех пор, пока условие внутри не станет истинным. Я также добавил заявления распечатки внутри flatmap для отладки. Потоки возвращаются только дважды, что соответствует ожиданию.
Однако, это работает отлично, без плоской карты в цепочке.
String[] strArraySingle = {"Sample3", "Sample4", "Sample5"};
Arrays.stream(strArraySingle)
.takeWhile(ele -> !ele.equalsIgnoreCase("Sample4"))
.forEach(ele -> System.out.println(ele));
Фактический выход:
Sample3
Здесь фактический вывод соответствует ожидаемому результату.
Отказ от ответственности: эти фрагменты предназначены только для практики кода и не служат для каких-либо действительных операций.
Update:
Ошибка JDK-8193856: исправление будет доступно как часть JDK 10.
Изменение будет состоять в том, чтобы исправить whileOps
Раковина:: принять
@Override
public void accept(T t) {
if (take = predicate.test(t)) {
downstream.accept(t);
}
}
Измененная реализация:
@Override
public void accept(T t) {
if (take && (take = predicate.test(t))) {
downstream.accept(t);
}
}