OptionalRefactoringUtil: do not suggest opt.map().stream() -> opt.stream().flatMap() if operation may have side-effect

Side-effect is allowed for Optional.map, but not allowed for Stream.flatMap, and actually may cause a semantics change
Fixes IDEA-207178 Incorrect simplification of optional suggested by inspection
This commit is contained in:
Tagir Valeev
2019-02-15 12:27:18 +07:00
parent cf6d1885ed
commit a8259d29d2
4 changed files with 28 additions and 6 deletions
@@ -15,7 +15,19 @@ public final class MyClass {
p.name().stream().mapToInt(String::length).forEach(System.out::println);
p.name().stream().flatMapToInt(String::chars).forEach(System.out::println);
p.name().filter(n -> !n.isEmpty()).stream().forEach(System.out::println);
p.name().stream().flatMap(MyClass::createStream);
p.name().map(m -> createStreamSideEffect(m)).orElse(Stream.empty());
Stream<Integer> stream = opt.stream();
}
static Stream<String> createStream(String s) {
return Stream.of(s, s);
}
static Stream<String> createStreamSideEffect(String s) {
System.out.println(s);
return Stream.of(s, s);
}
}
@@ -15,7 +15,19 @@ public final class MyClass {
p.name().map(n -> IntStream.of(n.length())).orElseGet(IntStream::empty).forEach(System.out::println);
p.name().map(String::chars).orElseGet(IntStream::empty).forEach(System.out::println);
p.name().map(n -> n.isEmpty() ? Stream.empty() : Stream.of(n)).orElseGet(Stream::empty).forEach(System.out::println);
p.name().map(m -> createStream(m)).orElse(Stream.empty());
p.name().map(m -> createStreamSideEffect(m)).orElse(Stream.empty());
Stream<Integer> stream = opt.map(Stream::of).orElseGet(Stream::empty);
}
static Stream<String> createStream(String s) {
return Stream.of(s, s);
}
static Stream<String> createStreamSideEffect(String s) {
System.out.println(s);
return Stream.of(s, s);
}
}