《Java8 实战》-读书笔记第一章(01) - V2EX
NGLSL
V2EX    Java

《Java8 实战》-读书笔记第一章(01)

  •  
  •   NGLSL
    nglsl Jul 31, 2018 1888 views
    This topic created in 2842 days ago, the information mentioned may be changed or developed.

    Blog:http://codedream.xin

    最近一直想写点什么东西,却不知该怎么写,所以就写写关于看《 Java8 实战》的笔记吧。

    第一章内容较多,因此打算分几篇文章来写。

    为什么要关心 Java8

    自 1996 年 JDK ( 1.0 )发布以来,Java 已经受到了学生、项目经理和 程序员等一大批活跃的用户的欢迎。这一语言极富活力,不断被用在大大小小的项目里。从 Java1.1 ( 1997 )年一直到 Java7 ( 2011 )年,Java 通过增加新功能,不断得到良好的升级。Java8 则是在 2014 年 3 月发布的。那么问题来了:为什么你应该关心 Java8 ?

    是的,Java 一直被吐槽写起来太嗦,没有 IDE 的快捷键和自动生成,简直就是在用生命写代码,因为太浪费时间。 例如,最简单的 HelloWorld:

    public class HelloWorld { public static void main (String[] args) { System.out.println("HelloWorld"); } } 

    都要这写么多代码,不使用快捷键或者语法模板去生成,真的很浪费时间。(初学者请忽略)

    所以,为了解决这个问题,Java8 中推出了核心新特性之一:Lambda (匿名函数) Lambda 表达式,是一个很不错很实用的一个新特性,如果你使用了这个新特性,也许会爱不释手。

    举个例子,比如我们对苹果进行按照重量进行排序,也许我们会这样写:

    private static List<Apple> apples = Arrays.asList(new Apple(100, "red"), new Apple(101, "green"), new Apple(132, "green"), new Apple(90, "green"), new Apple(122, "red") ); 
    Collections.sort(apples, new Comparator<Apple>() { public int compare(Apple o1, Apple o2) { return o1.getWeight() < o2.getWeight() ? -1 : ((o1.getWeight() == o2.getWeight()) ? 0 : 1); } }); 

    在 Java8 里,你可以这样写,这样写看起来更接近问题的描述:

    apples.sort(Comparator.comparing(Apple::getWeight)); 

    是不是有点心动啊,本来需要五六行解决的排序的代码,现在只要一行即可!趁热打铁,继续吧。 Java8 里面将代码传递给方法的功能(同时也能够放回代码并将其包含在数据结构中),还让我们能够使用一整套技巧,通常称为函数式编程。

    现在你需要筛选一个目录中的所有隐藏文件,你会怎么做? 大部分人立马会想到,File 类中不就是有一个 isHidden 的方法吗?使用这个方法就可以判断哪些是隐藏文件啦。 是的,如下所示:

    File[] files = new File("D:\\.").listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.isHidden(); } }); 

    看起来很简单,很明了嘛!那还可以不可以继续优化简短一下呢?答案是当然可以的。 如下所示:

    File[] files = new File("D:\\.").listFiles(File::isHidden); 

    太酷了,有了函数 isHidden,因此只需要使用 Java8 的方法引用语法::(即“把这个方法作为值”)将其传给 listFiles 方法就可以了。

    代码传递:一个例子

    来看看一个例子,看看它是如何帮你你写程序的。依旧使用刚刚对苹果排序的代码。现在,要做的是筛选出所有的绿苹果,也许你会这一个这样的方法 filterGreenApples:

    public static List<Apple> filterGreenApples(List<Apple> apples) { List<Apple> result = new ArrayList<>(); for (Apple apple :apples) { if ("green".equals(apple.getColor())) { result.add(apple); } } return result; } 

    在 Java8 之前,基本上都是这样写的,看起来也没什么毛病。但是,现在又要筛选一下重量超过 120 克的苹果。哦,一想很简单嘛,把上面的代码复制、粘贴改一下就好啦:

    public static List<Apple> filterHeavyApples(List<Apple> apples) { List<Apple> result = new ArrayList<>(); for (Apple apple : apples) { if (apple.getWeight() > 120) { result.add(apple); } } return result; } 

    虽然简单,但是还是出现了一些重复地方,看起来不太好。这两段代码的差异只是条件不同,那么只需要把接受重量的上下限作为参数传递给 filter 就可以了,使用 Java8 来优化一下这些代码:

     public static void main (String[] args) { // 筛选出绿色苹果 List<Apple> greenApples = filterApples(apples, FilterApples::isGreenApple); System.out.println(greenApples); // 筛选重量大于 120 克的苹果 List<Apple> heavyApples = filterApples(apples, FilterApples::isHeavyApple); System.out.println(heavyApples); } public static boolean isGreenApple(Apple apple) { return "green".equals(apple.getColor()); } public static boolean isHeavyApple(Apple apple) { return apple.getWeight() > 120; } public static List<Apple> filterApples(List<Apple> apples, Predicate<Apple> predicate) { List<Apple> result = new ArrayList<>(); for (Apple apple : apples) { if (predicate.test(apple)) { result.add(apple); } } return result; } interface Predicate<T> { /** * 根据给定的参数计算此谓词 * * @param t * @return */ boolean test(T t); } 

    在这段代码中,自定义了一个接口 Predicate<t>,中文意思是谓词:</t>

    什么是谓词?

    前面的代码传递了方法 Apple::isGreenApple (它接受参数 Apple 并返回一个 boolean )给 filterApples。后者希望接受一个 Predicate<apple>参数。谓词( predicate )在数学上常常用来代表一个类似函数的东西,它接受一个参数值,并返回 true 或 false。</apple>

    当然,Java8 中已经有了一个 Predicate<t>接口,因此,我们也不需要去定义一个这样的接口啦。</t>

    使用自定义的 Predicate 接口中的方法,你创建了一个方法引用,你无须去关注 test 方法是如何实现的,你只要知道你引用的某个方法即可。

    读书笔记系列的文章,因为我的文笔不是很好,一些观点可能描述的不是那么的好,文章中有误的地方还请各位读者指正,非常感谢。

    No Comments Yet
    About     Help     Advertise     Blog     API     FAQ     Solana     3340 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 492ms UTC 13:40 PVG 21:40 LAX 06:40 JFK 09:40
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86