Java 8函数式编程实战(一)Lambda表达式

Java 8函数式编程实战(一)Lambda表达式

背景介绍

开篇之前,按照惯例,先介绍一下为什么要编写这个系列的博文。因为最近想系统的学习下java8的一些新特性,即使在日常工作中经常使用,但有些使用的姿势跟背后的思想还是没有领悟到精髓,特此买了本《Java 8函数式编程实战》来学习一下,本系列的博文主要也是沿用该书脉络,使用每个章节中提出的一些练习,重点会突出实践,理论的东西点到为止,如果想深入了解请阅读该书,特别不错噢~
特别说明:本系列的分享重点突出实践,通过分析一些实战练习,从中去提炼一些理论要点

Lambda表达式

代码示例

特别说明,本系列博客中的示例一部分来源于《Java 8函数式编程实战》,这部分示例围绕这“音乐”这个领域,下面的代码包含:Artist 类(创作音乐的个人或团队)、Track类(专辑中的一支曲目)、Album(专辑,由若干曲目组成)、SampleData类(初始化样例数据构建的类)。为了后续不在重复以上公共基础类,特此摘要如下:

  • Artist 类(创作音乐的个人或团队)
public final class Artist {
    
   /**
     * 艺术家的名字(例如:“甲壳虫乐队”)
     */
    private String name;
    /**
     * 乐队成员(例如“约翰·列侬”),该字段可为空
     */
    private List<Artist> members;
    /**
     * 乐队来自哪里(例如“利物浦”)
     */
    private String nationality;
    
    public Artist(String name, String nationality) {
        this(name, Collections.emptyList(), nationality);
    }

    public Artist(String name, List<Artist> members, String nationality) {
        Objects.requireNonNull(name);
        Objects.requireNonNull(members);
        Objects.requireNonNull(nationality);
        this.name = name;
        this.members = new ArrayList<>(members);
        this.nationality = nationality;
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @return the members
     */
    public Stream<Artist> getMembers() {
        return members.stream();
    }

    /**
     * @return the nationality
     */
    public String getNationality() {
        return nationality;
    }

    public boolean isSolo() {
        return members.isEmpty();
    }

    public boolean isFrom(String nationality) {
        return this.nationality.equals(nationality);
    }

    @Override
    public String toString() {
        return getName();
    }

    public Artist copy() {
        List<Artist> members = getMembers().map(Artist::copy).collect(toList());
        return new Artist(name, members, nationality);
    }

}
  • Track类(专辑中的一支曲目)
public final class Track {
    
    /**
     * 曲目名称(例如《黄色潜水艇》)
     */
    private final String name;
    /**
     * 曲目时常(单位毫秒)
     */
    private final int length;

    public Track(String name, int length) {
        this.name = name;
        this.length = length;
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @return the length of the track in milliseconds.
     */
    public int getLength() {
        return length;
    }

    public Track copy() {
        return new Track(name, length);
    }

}
  • Album(专辑,由若干曲目组成)
public final class Album implements Performance {
    
   /**
     * 专辑名(例如《左轮手枪》)
     */
    private String name;
    /**
     * 专辑上所有曲目的列表
     */
    private List<Track> tracks;
    /**
     * 参与创作本专辑的艺术家列表
     */
    private List<Artist> musicians;

    public Album(String name, List<Track> tracks, List<Artist> musicians) {
        Objects.requireNonNull(name);
        Objects.requireNonNull(tracks);
        Objects.requireNonNull(musicians);

        this.name = name;
        this.tracks = new ArrayList<>(tracks);
        this.musicians = new ArrayList<>(musicians);
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @return the tracks
     */
    public Stream<Track> getTracks() {
        return tracks.stream();
    }

    /**
     * Used in imperative code examples that need to iterate over a list
     */
    public List<Track> getTrackList() {
        return unmodifiableList(tracks);
    }

    /**
     * @return the musicians
     */
    public Stream<Artist> getMusicians() {
        return musicians.stream();
    }

    /**
     * Used in imperative code examples that need to iterate over a list
     */
    public List<Artist> getMusicianList() {
        return unmodifiableList(musicians);
    }

    public Artist getMainMusician() {
        return musicians.get(0);
    }

    public Album copy() {
        List<Track> tracks = getTracks().map(Track::copy).collect(toList());
        List<Artist> musicians = getMusicians().map(Artist::copy).collect(toList());
        return new Album(name, tracks, musicians);
    }

}
  • SampleData类(初始化样例数据构建的类)
public class SampleData {

    public static final Artist johnColtrane = new Artist("John Coltrane", "US");
    public static final Artist johnLennon = new Artist("John Lennon", "UK");
    public static final Artist paulMcCartney = new Artist("Paul McCartney", "UK");
    public static final Artist georgeHarrison = new Artist("George Harrison", "UK");
    public static final Artist ringoStarr = new Artist("Ringo Starr", "UK");

    public static final List<Artist> membersOfTheBeatles = Arrays.asList(johnLennon, paulMcCartney, georgeHarrison, ringoStarr);

    public static final Artist theBeatles = new Artist("The Beatles", membersOfTheBeatles, "UK");

    public static final Album aLoveSupreme = new Album("A Love Supreme", asList(new Track("Acknowledgement", 467), new Track("Resolution", 442)), asList(johnColtrane));

    public static final Album sampleShortAlbum = new Album("sample Short Album", asList(new Track("short track", 30)), asList(johnColtrane));

    public static final Album manyTrackAlbum = new Album("sample Short Album", asList(new Track("short track", 30), new Track("short track 2", 30), new Track("short track 3", 30), new Track("short track 4", 30), new Track("short track 5", 30)), asList(johnColtrane));

    public static Stream<Album> albums = Stream.of(aLoveSupreme);

    public static Stream<Artist> threeArtists() {
        return Stream.of(johnColtrane, johnLennon, theBeatles);
    }

    public static List<Artist> getThreeArtists() {
        return Arrays.asList(johnColtrane, johnLennon, theBeatles);
    }

}

特别说明

java8的最大变化是引入了lambda表达式——一种紧凑的、传递行为的方式。它也是本系列后续所述内容的基础,所以本博文《Java 8函数式编程实战(一)Lambda表达式》内容将会持续的更新,lambda表达式也会渗透到后续所述的章节中,敬请期待,也欢迎大家一起交流学习~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

健身的IT鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值