
java1.8
文章平均质量分 70
LinkinPark8林肯
博客迁移,请移步jiangweili.me
展开
-
函数式编程--为什么会出现lambda表达式?
java一直处在发张和演化的过程中,其中有2个版本从根本上改变了代码的编写方式。第一个就是JDK5之后增加的泛型,还有一个就是现在介绍的函数式编程,lambda表达式。lambda表达式是java8新增的功能,他们明显的增强了java,原因2点:1),它们增加了新的语法元素,使java语言的表达能力得以提升,并流线化了一些常用结构的实现方法2),lambda表达式的加入也导致了AP原创 2015-10-23 16:16:20 · 726 阅读 · 0 评论 -
函数式编程--使用lambda表达式
前面一篇博客我们已经说到了,lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口的实例。现在我们来写一段java的命令者模式来自己研究下lambda表达式的语法。这里重复下命令者模式:考虑这么一个情景,某个方法需要完成一个行为,但是这个行为的具体实现无法确定,必须等到执行该方法时才可以确定。举个例子,我有个方法需要遍历某个数组的数组元素,但是无法确定在遍历这个数组元素时如何处原创 2015-10-23 20:06:23 · 1141 阅读 · 0 评论 -
函数式编程--lambda表达式对比匿名内部类
从前面的整理中我们看出了,Lambda表达式其实是匿名内部类的一种简化,因此它可以部分取代匿名内部类。1,Lambda表达式与匿名内部类存在如下相同点:1),Lambda表达式与匿名内部类一样,都可以直接访问“effectively final”的局部变量,以及外部类的成员变量2),Lambda表达式创建的对象与匿名内部类生成的对象一样,都可以直接调用从接口中继承的默认方法。原创 2015-10-27 16:00:56 · 5799 阅读 · 0 评论 -
函数式编程--方法和构造器引用
前面已经说过了,如果lambda表达式的代码块只有一行代码,可以省略lambda表达式中代码块的花括号,语句后面的逗号也要省去的。不仅如此,如果lambda表达式的代码块只有一行代码,还可以在代码中使用方法引用和构造器引用。方法引用和构造器引用可以让lambda表达式编码更加简洁,具体语法就是使用2个英文冒号,然后加上方法名字,注意没有括号的。一共有4种情况,类引用类方法,对象引用实例原创 2015-10-26 15:37:05 · 1334 阅读 · 0 评论 -
java1.8--改进的接口
关于接口,每天的编码都在写,就不多说了。这里对比下接口,抽象类,类3者的关系:1),接口是一种规范,就是告诉外界这个东东可以做什么。2),抽象类是一种模板,就是告诉外界这个东西的一部分公共功能。3),类和上面的接口,抽象类最大的区别就是类可以维护状态信息。在以前的接口中1,没有构造方法,不能实例化2,接口只能继承接口,不能继承类3,接口里没有普通方法,方法全原创 2015-10-27 10:54:01 · 773 阅读 · 0 评论 -
java1.8--Optional类
身为一名Java程序员,大家可能都有这样的经历:调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法。我们首先要判断这个返回值是否为null,只有在非空的前提下才能将其作为其他方法的参数。这正是一些类似Guava的外部API试图解决的问题,前面一篇博客我也整理到了Null Object模式,也可以解决这个问题。现在不用再被这些事情恶心了,java8引入了一个新的Option原创 2015-10-30 18:08:32 · 4115 阅读 · 0 评论 -
java1.8--Null Object模式
整理这篇博客是因为现在在整理java8中的optional,所以觉得很有必要整理下Null Object模式。java.lang.NullPointerException,只要敢自称Java程序员,那对这个异常就再熟悉不过了。为了防止抛出这个异常,我们经常会写出这样的代码:Person person = people.find("LinkinPark...");if (person != n原创 2015-10-30 16:12:58 · 3719 阅读 · 0 评论 -
java1.8--OptionalInt,OptionalDouble,OptionalLong类
OptionalInt,OptionalDouble,OptionalLong类的工作方式与Optional类十分类似,只不过他们是专门操作int,都变了,long类型的值而设计的。因此,他们分别定义了getAsDouble(),getAsInt(),getAsLong()方法,而不是get()方法。值得注意的一点是,上面这3个类并不支持ofNullable(),filter(),ma原创 2015-10-31 14:17:54 · 8993 阅读 · 0 评论 -
lambda高级进阶--延迟执行
前面的整理我们也已经说到了,使用lambda表达式的主要原因是,将代码的执行延迟到一个合适的时间点。在使用lambda表达式的时候务必记住一点就是说lambda表达式都是延迟执行的。延迟执行代码的原因有很多,具体的如下。1,在另外一个线程中运行代码2,多次运行代码3,在某个算法的正确时间点上运行代码,比如排序中的比较操作4,当某些情况发生时才运行代码5,只有在需要的时候才运原创 2015-11-23 14:45:05 · 2096 阅读 · 0 评论 -
lambda高级进阶--返回函数
在函数式编程语言中,函数是一级公民。如同你可以将数字传递给方法,也可以让方法产生数字一样,函数不仅可以作为参数,也可以作为返回值。这听起来好像有点抽象,在JAVA编码中,我们好像也很少这样子写到,但是还是很有必要理解这种设计,特别是在1.8之后的java中。现在来看下面的代码示例:public class Linkin{ // 编写一个静态方法,对str这个字符串做一元操作 pu原创 2015-11-23 14:48:55 · 2784 阅读 · 0 评论 -
lambda高级进阶--表达式参数
1,现在我们封装一个方法,来提供一个比较器,显然比较器是拥有两个参数的--用来比较的两个值。public class Linkin{ public static String[] sort(String[] array) { Arrays.sort(array, (s, t) -> Integer.compare(s.length(), t.length())); return原创 2015-11-23 14:47:12 · 2423 阅读 · 0 评论 -
函数式编程--变量作用域
1,lambda表达式捕获变量通常,我们希望能够在lambda表达式的闭合方法或类中访问其他的变量,比如下面的代码:public class Test{ public void test(String text, int count) { Runnable a = () -> { for (int i = 0; i < count; i++) { Sy原创 2015-10-26 09:58:42 · 2690 阅读 · 0 评论 -
流API--原始类型流
到目前为止,我们已经将整型收集到了一个Stream的流中,不过将每个整数包装成相应对象显然是一个低效的做法,对于其他的基本类型也是一样,我们前面说过jdk提供包装类已经自动装箱和拆箱只是为了面向对象编程,我们不应该滥用。为此,流API提供了IntStream,LongStream,DoubleStream等类型,专门用来直接存储原始类型值,不必使用包装。注意的是,一共是有8个的基本类型,流API只原创 2015-11-09 16:46:00 · 1346 阅读 · 0 评论 -
流API--提取流+组合流
提取子流和组合流1,limit(n)会返回一个包含n个元素的新流,如果原始流的长度小于n,则会返回原始的流。这个方法可用来裁剪指定长度的流。2,skip(n)正好相反,它会丢弃掉前面的n个元素。3,静态方法,concat()方法将2个流连接在一起。注意一点,第一个流的长度不应该是无限的,不然第2个流永远没有机会被添加到第1个流的后面。4,findFrist()返回非空集合中的第一个原创 2015-11-09 16:44:11 · 568 阅读 · 0 评论 -
java1.8--1.8入门介绍
在我之前的工作中,一直使用的是java6。所以即使现在java已经到了1.8,对于1.7增加的新特性我也基本没使用的。在整理一系列1.8的新特性的过程中,我也会添加上1.7增加的特性。下面的整理可能是java7最重要的新特性:1,String现在能够控制switch语句2,二进制整型字面量3,数值字面量中的下划线4,扩展的try语句,称为带资源的try语句,这种try语句支持自原创 2015-10-23 11:13:01 · 1345 阅读 · 0 评论 -
函数式编程--函数式接口
Lambda表达式的类型,也被称为目标类型,lambda表达式的目标类型必须是函数式接口。函数式接口代表只包含一个抽象方法的接口。函数式接口可以包含多个默认方法,类方法,当只能声明一个抽象方法。java8中专门为函数式接口提供了一个@FunctionalInterface注解,该注解通常方法接口定义前面,这个注解没有任何作用,只是告诉编译器执行更加严格,检查该接口必须是函数式接口,否则编译原创 2015-10-23 22:04:21 · 1119 阅读 · 0 评论 -
流API--流的映射
很多时候,将一个流的元素映射到另外一个流很有帮助。映射操作最具代表的就是map()方法。实际编码中,我们会经常用到,所以这里专门整理一篇博客。考虑如下情景,对于一个包含了姓名,电话,年龄等属性构成的数据库的流,我们现在只想处理这个流中的姓名属性。或者是我们希望对流中一些元素做一些转换,比如只针对上面的姓名做一些处理。map()方法签名如下: Stream map(Function ma原创 2015-11-09 16:30:31 · 190 阅读 · 0 评论 -
流API--流的迭代
虽然流不是数据存储对象,但是仍然可以使用迭代器来遍历其元素,就如同使用迭代器遍历集合中的元素一样。流API支持2类迭代器,一类是传统的Iterator,另一类是JDK8新增的Spliterator。对流使用传统的迭代器要获得流的迭代器,在流上调用interator()方法,然后调用hasNext()方法和next()方法即可。代码如下:public static voi原创 2015-11-09 16:35:47 · 111 阅读 · 0 评论 -
流API--分组和分片
分组和分片对具有相同特性的值进行分组时一个很常见的任务,我们可以直接使用groupingBy来进行分组。当分类函数是一个predicate函数时,流会被分成2组列表,一组返回true,一组返回false。public class Test{ public static void main(String[] args) { Stream stream = Stream.o原创 2015-11-09 16:40:27 · 2127 阅读 · 0 评论 -
流API--缩减操作
在Stream流操作中,比如说min(),max(),count()方法,这几个操作都会将一个流缩减成一个值,流API将这些操作称为特例缩减。另外,流API同时泛华了缩减这种概念,提供了reduce()方法,通过使用reduce()方法,可以基于任意条件,从流中返回一个值。根据定义,所有缩减操作都是终端操作。我们先来翻下api:Optional reduce(BinaryOperator原创 2015-11-09 16:42:13 · 499 阅读 · 0 评论 -
流API--初体验
在JDK8新增的许多功能中,有2个功能最重要,一个是Lambda表达式,一个是流API。Lambda表达式前面我已经整理过了,现在开始整理流API。首先应该如何定义流API中的“流”这个概念呢?记住:流是数据的渠道。高中的时候我们就学过电流,水流,磁场流,然后java中还有io流,那么这个流到底是什么东西呢?我们这样子来理解:流是一种对抽象化事物的模拟。流本身并不存储数据,它只是代表一个对原创 2015-11-09 16:20:55 · 443 阅读 · 0 评论 -
流API--流的基础知识
流接口--BaseStream接口流API定义了几个流接口,这些接口包含在java.util.stream中。BaseStream是基础接口,它定义了所有流都可以使用的基本功能。我们来看一下源码:public interface BaseStream> extends AutoCloseable {}这是一个泛型接口,T指定流中元素的类型,S指定扩展BaseStream的流的类型。Ba原创 2015-11-09 16:24:33 · 707 阅读 · 0 评论 -
流API--使用并行流
这篇博客一起来研究下使用并行流。借组多核处理器并行执行代码可以显著提高性能,但是并行编程可能十分复杂且容易出错,流API提供的好处之一是能够轻松可靠的并行执行一些操作。请求并行处理流,首先要获得一个并行流。获取一个并行流有2个方法:1,Collection定义的parallelStream()方法2,对顺序流调用parallel()方法。一下代码演示如果获取一个并行流:publ原创 2015-11-09 16:27:08 · 876 阅读 · 0 评论 -
流API--流的收集
前面的一系列博客中,我们都是从一个集合中拿到一个流,但是有时候需要执行反操作,就是从流中获得集合。实际编码中,当我们处理完流后,我们通常想查看下结果,而不是将他们聚合成一个值。我们可以调用iterator方法来生成一个传统风格的迭代器,用于访问元素。1,将流中的元素收集到一个数组中,调用toArray()方法即可由于无法在运行时创建一个泛型数组,所以调用toArray()方法将返回原创 2015-11-09 16:33:38 · 126 阅读 · 0 评论 -
lambda高级进阶--组合函数
只有一个参数的函数可以将一个值转换成另一个值,如果你有2个这样的转换函数,那么在进行一个转换之后在进行第二个转换,其实也是一个中转换。说到这里,先说一下我个人的一个习惯,我在写javaBean的set()方法时,一半都不是void类型,都是返回当前对象,这样子我在给这个对象设值的时候就可以一直打点调下去了,不用罗里吧嗦的写很多次对象了。OK,现在回到主题,我们先来考虑一个情景,我们原创 2015-11-23 14:51:44 · 302 阅读 · 0 评论