Java 8 函数式编程(3)

本篇对应《Java 8 函数式编程》的第四章。


要点回顾

  1. 使用为基本类型定制的Lambda表达式和Stream,如IntStream可以显著提升系统性能。
  2. 默认方法是指接口中定义的包含方法体的方法,方法名有default关键字做前缀。
  3. 在一个值可能为空的建模情况下,使用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");
    }

}

参考:

163 total views, no views today