下面用Java 8编译的代码可以正常工作,但不能用Java 9工作.不确定STREAMS执行过程中发生了什么变化.
import java.util.*;
import java.util.function.Predicate;
import java.util.stream.Stream;
import java.lang.*;
public class TestingJavaStream {
public static void main(String[] args) {
Message message = new Message();
message.setName("Hello World!");
Stream<Message> messageStream = streamNonnulls(Collections.singleton(message))
.filter(not(Collection::isEmpty))
.findFirst()
.map(Collection::stream)
.orElseGet(Stream::empty);
System.out.println("Number of messages printed are "
+ messageStream
.map(TestingJavaStream::print)
.count());
}
public static class Message {
private String name;
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Message other = (Message) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return "Message [name=" + name + "]";
}
}
@SafeVarargs
public static <T> Stream<T> streamNonnulls(T... in) {
return stream(in).filter(Objects::nonNull);
}
@SafeVarargs
public static <T> Stream<T> stream(T... in) {
return Optional.ofNullable(in)
.filter(arr -> !(arr.length == 1 && arr[0] == null))
.map(Stream::of)
.orElseGet(Stream::empty);
}
public static <T> Predicate<T> not(Predicate<T> p) {
return (T x) -> !p.test(x);
}
public static Message print(Message someValue) {
System.out.println("Message is :: "+someValue.toString());
return someValue;
}
}
代码中的print
方法在使用8执行时打印消息,但在使用9执行时不打印消息.
PS:我知道可以通过将可选逻辑更改为stream().flatmap(...)来简化流代码,但这不是重点.