本篇对应《Java 8 函数式编程》的第四章。
要点回顾
- 使用为基本类型定制的Lambda表达式和Stream,如IntStream可以显著提升系统性能。
- 默认方法是指接口中定义的包含方法体的方法,方法名有default关键字做前缀。
- 在一个值可能为空的建模情况下,使用Optional对象能替代使用null值。
练习
Question 1:
/** 该接口表示艺术家的演出——专辑或演唱会 */
public interface Performance {
public String getName();
public Stream<Artist> getMusicians();
public default Stream<Artist> getAllMusicians() {
return getMusicians()
.flatMap(artist -> concat(Stream.of(artist), artist.getMembers()));
}
}
Question2:
不能。
public interface Parent {
default public boolean equals(Object object) {
return true;
}
default public int hashCode() {
return 1;
}
}
% javac Parent.java
Parent.java:2: error: default method equals in interface Parent overrides a member of java.lang.Object
default public boolean equals(Object object) {
^
Parent.java:6: error: default method hashCode in interface Parent overrides a member of java.lang.Object
default public int hashCode() {
^
2 errors
Question 3:
public class Artists {
private List<Artist> artists;
public Artists(List<Artist> artists) {
this.artists = artists;
}
public Optional<Artist> getArtist(int index) {
if (index < 0 || index >= artists.size()) {
return Optional.empty();
}
return Optional.of(artists.get(index));
}
public String getArtistName(int index) {
Optional<Artist> artist = getArtist(index);
return artist.map(Artist::getName)
.orElse("unknown");
}
}
参考:
794 total views