Java8使用分享

2019-07-09  本文已影响0人  cjp1016

函数式接口

什么是?

java.util.function

其他函数式接口

如何用?

Lambda表达式

什么是?

用来表示一个行为或传递代码,用来创造函数式接口的实例(对象),匿名内部类也可以完成同样的事情。

箭头标识:
() -> 表达式  , s -> { ... }  , (a,b)-> {...} 

方法引用

如果一个Lambda只是直接调用这个方法,那么还是用名称去调用,而不是描述如何调用它。仅仅涉及单一方法的Lambda语法糖。

Lambda 等效的方法引用
Reference to a static method ContainingClass::staticMethodName
Reference to an instance method of a particular object containingObject::instanceMethodName
Reference to an instance method of an arbitrary object of a particular type ContainingType::methodName
Reference to a constructor ClassName::new

如何用?

// JDK8之前 匿名内部类写法
new Thread(new Runnable(){// 接口名
    @Override
    public void run(){// 方法名
        System.out.println("Thread run()");
    }
}).start();

// JDK8之后 Lambda表达式写法
new Thread(() -> {
    System.out.println("Thread run()");
}).start();// 省略接口名和方法名

//  JDK8之前
list.sort(new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return o1.length() - o2.length();
    }
});
// JDK8之后
list.sort((s1,s2) -> s1.length()-s2.length());
list.sort(comparing(String::length));

// -> 和 双冒号
List<String> list = Arrays.asList("aaaa", "bbbb", "cccc");
list.forEach(s -> System.out.println(s)); // lambda
list.forEach(System.out::println); // method reference

Stream流

什么是?

Stream接口,主要是对集合对象功能的增强。简单理解是某种数据源的视图,数据源不能是Map。

Stream跟函数式接口关系非常紧密,没有函数式接口stream就无法工作。stream只能被“消费”一次。

从有序集合生成流时,会保留原有的顺序。慎用并行BaseStream的parallel()

如何用?

Stream的归集操作 reduce 和 collect

Optional类

什么是?

java.util.Optional<T> 是一个容器类,代表一个值存在或不存在,不能被序列化。

如何用?

时间日期类

Java8之前,Date类都是可变类。而Java8的Date和Time API提供 线程安全的不可变类且线程安全的。

Java8与重构

方法参数传递由值传递,转变为类(对象)传递,匿名类,Lambda,方法引用。这是:值参数化到行为参数化的转变。

为了因对不断变化的需求,行为参数化。抽象化,使代码更加灵活,后期维护代码更加方便!

总结

学习三部曲:什么是? what 如何用? how 为什么? why

函数式编程又称λ演算(lambda calculus),匿名函数。在编程语言中的函数通常指的是方法。从接口式编程,到函数式编程!

Java8 提倡函数式编程:

  1. 简少代码量:减少for...each 语句,实现类,匿名内部类。
  2. 增加代码清晰度:方法内直接写明操作行为,更加好维护
  3. 提高计算效率:让并行计算更加简单
上一篇 下一篇

猜你喜欢

热点阅读