java8实战
维所欲为
这个作者很懒,什么都没留下…
展开
-
第二章 通过行为参数化传递代码
首先,思考一个问题,比如说一个养猪厂的厂长要你帮忙设计一个程序,统计他猪场内白猪的 数量。你轻蔑的一笑,这很简单啊,于是你迫不及待的开工了。先模拟一些猪的数据:var pigList = new ArrayList<Pig>();pigList.add(new Pig("黑色", 120));pigList.add(new Pig("白色", 300));pi...原创 2018-07-29 19:41:09 · 324 阅读 · 0 评论 -
第五章(5)数值流 (去装箱化)
我们之前学了规约reduce,那么统计所有菜的总热量应该这么做:List<Dish> menu = Arrays.asList( new Dish("pork", false, 800, Dish.Type.MEAT), new Dish("beef", false, 700, Dish.Type.MEAT), new Dish("ch...原创 2018-08-20 21:05:41 · 152 阅读 · 0 评论 -
第五章 (1)使用流------筛选和切片
1.筛选filter中间操作filter,比如找出热量大于400的菜品形成一个列表List<Dish> heightDishNameDishs = menu.parallelStream().filter(d1 -> d1.getCalories()>400)//热量大于40 .collect(Collectors.toList());//形成一个List...原创 2018-08-08 22:56:58 · 169 阅读 · 0 评论 -
第四章(1) 流Stream介绍
1.使用流的好处 流是Java API的新成员,它允许你以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现,例如你要在集合中筛选一个红色的苹果,你可以用类似于sql式的查询结构来说明你要干什么就可以了,而无需想着如何的去实现它,比如使用for循环+if判断)。就现在来说,你可以把它们看成遍历数据集的高级迭代器。此外,流还可以透明地并行处理,你无需写任何多线程代码了!我们...原创 2018-08-08 22:32:16 · 213 阅读 · 0 评论 -
第三章 (4)扩展------lambda表达式与闭包(关于lambda使用局部变量的补充)
关于闭包,掌握js的童鞋会更加的了解,但是如今,我们在学习java8的lambda的时候,上一章提到lambda关于使用局部变量的时候,书中提到了lambda与闭包的问题。他的原话是这么说的: 你可能已经听说过闭包(closure,不要和Clojure编程语言混淆)这个词,你可能会想Lambda是否满足闭包的定义。用科学的说法来说,闭包就是一个函数的实例,且它可以无限制地访...原创 2018-08-02 23:40:05 · 2290 阅读 · 2 评论 -
第三章(3) lambda表达式类型检查、类型推断以及局部变量
1.类型检查 当我们在之前第一次提到lambda表达式的时候,说它可以为函数式接口生成一个实例。然而,Lambda表达式本身并不包含它在实现哪个函数式接口的信息。为了全面了解Lambda表达式,你应该知道Lambda的实际类型是什么。 Lambda的类型是从使用Lambda的上下文推断出来的。 所谓上下文,举个例子,比如说lambda表达式的参数...原创 2018-08-02 22:34:16 · 1381 阅读 · 0 评论 -
第三章(6)复合Lambda表达式
你可以把多个简单的Lambda复合成复杂的表达式。比如,你可以让两个谓词之间做一个or操作,组合成一个更大的谓词。而且,你还可以让一个函数的结果成为另一个函数的输入。你可能会想,函数式接口中怎么可能有更多的方法呢?(毕竟,这违背了函数式接口的定义啊!)窍门在于,我们即将介绍的方法都是默认方法,也就是说它们不是抽象方法。我们会在第9章详谈。1.比较器复合我们之前说到,比较一个列表中...原创 2018-08-06 22:41:27 · 258 阅读 · 0 评论 -
第三章(5)方法引用
1.方法引用初探 方法调用可以被看作仅仅调用特定方法的lambda表达式的一种快捷写法。如果一个Lambda代表的只是“直接调用这个方法”,那最好还是用名称来调用它,而不是去描述如何调用它。事实上,方法引用就是让你根据已有的方法实现来创建Lambda表达式。但是,显式地指明方法的名称,你的代码的可读性会更好。类如:我们要在苹果列表中提取苹果的Name属性,形成另一个苹果名称列表:...原创 2018-08-06 17:43:07 · 305 阅读 · 2 评论 -
第三章(2) JAVA8 api为我们提供的函数式接口
咱们书接上回,上回咱们说到,Java 8的库设计师帮你在java.util.function包中引入了几个新的函数式接口。我们接下来会介绍Predicate、Consumer和Function。 1.Predicate(谓词) 关于谓词,我们之前在第二章中说过,它是返回布尔值的一种抽象方法。那么在java8中,已经为我们提供了这个接口了,我们直接拿来用就可以了,如下...原创 2018-08-01 17:50:12 · 261 阅读 · 0 评论 -
第三章(1) Lambda表达式
1.lambda表达式的基本形式 在上一章中,你了解了利用行为参数化来传递代码有助于应对不断变化的需求。它允许你定义一个代码块来表示一个行为,然后传递它。你可以决定在某一事件发生时(例如单击一个按钮)或在算法中的某个特定时刻(例如筛选算法中类似于“重量超过150克的苹果”的谓词,或排序中的自定义比较操作)运行该代码块。一般来说,利用这个概念,你就可以编写更为灵活且可重复使用的代码了。...原创 2018-08-01 10:31:35 · 391 阅读 · 0 评论 -
第五章(4)流的规约操作reduce
我们之前见识了流的终端操作返回了boolen,List,Optional等。那么这一章节我们介绍诸如求和,找出最大值最小值的玩法。1.元素求和(或积等其他运算)这个,用之前的方法,我相信大家都会得:List<Integer> nums = Arrays.asList(1,2,3,4,5,6,7);int sum = 0;for(Integer integer:nums...原创 2018-08-09 17:50:59 · 1092 阅读 · 0 评论 -
第五章(3)查找和匹配
另一个常见的数据处理套路是看看数据集中的某些元素是否匹配一个给定的属性。Stream API通过allMatch、anyMatch、noneMatch、findFirst和findAny方法提供了这样的工具。1.检查谓词是否至少匹配一个元素anyMatch 检查谓词是否至少匹配一个元素anyMatch方法可以回答“流中是否有一个元素能匹配给定的谓词”。比如,你可以用它...原创 2018-08-09 14:42:20 · 287 阅读 · 0 评论 -
第五章(2)使用流-----映射
1.map映射的基本使用 一个非常常见的数据处理套路就是从某些对象中选择信息。比如在SQL里,你可以从表中选择一列。Stream API也通过map和flatMap方法提供了类似的工具。List<Dish> menu = Arrays.asList( new Dish("pork", false, 800, Dish.Type.MEAT), new ...原创 2018-08-09 13:38:41 · 157 阅读 · 0 评论 -
第一章 我们为什么要关心java8
1.Java 8中新增的核心内容提供了令人激动的新概念和功能,方便我们编写既有效又简洁的程序。2.8以前的java版本编程实践并不能很好地利用多核处理器。而java8的Stream api可以让我们实现利用电脑的多核进行并行处理。3.函数是一等值;(所谓一等值,我理解的是可以像基本类型和其他引用类型一样可以当作参数或返回值)关注java8的方法如何作为函数式值来传递,还有Lambda是怎样...原创 2018-07-27 16:10:38 · 149 阅读 · 0 评论 -
第五章(5) 数值范围及数值流综合使用案例----获取勾股数勾股数
1.产生一个数值范围 和数字打交道时,有一个常用的东西就是数值范围。比如,假设你想要生成1和100之间的所有数字。Java 8引入了两个可以用于IntStream和LongStream的静态方法,帮助生成这种范围:range和rangeClosed。这两个方法都是第一个参数接受起始值,第二个参数接受结束值。但range是不包含结束值的,而rangeClosed则包含结束值。让我们...原创 2018-08-20 22:48:16 · 292 阅读 · 0 评论