没有合适的资源?快使用搜索试试~ 我知道了~
首页Java8 新特性之lamdba表达式和Optional
1 Lambda表达式 2 1.1 Lambda语法糖 2 1.1.1 语法 2 1.1.2 Lambda表达式可使用的变量 3 1.1.3 lambda表达式中的this概念 3 1.2 函数式接口- Consumer/Predicate/Function/Supplier 4 1.1.4 什么是函数式接口 4 1.1.5 Consumer接口 5 1.1.6 Function接口 6 1.1.7 Supplier接口 8 1.1.8 Predicate接口 9 1.3 方法引用和构造器 12 1.2.1 方法引用 12 1.2.2 构造器 12 1.4 Stream语法 13 1.3.1 入门案例 13 1.3.2 怎么得到Stream 15 1.3.3 转换Stream 16 1.3.4 汇聚Stream 19 2 Optional类 20 2.1 创建Optional容器 21 2.2 容器简单方法 22 2.3 容器进阶方法 23 1.3.5 ifPresent方法 23 1.3.6 orElseGet和orElseThrow方法 23 1.3.7 filter方法 24 1.3.8 map方法 24 1.3.9 flatMap方法 25 2.4 总结 25
资源详情
资源评论
资源推荐

Java8 新特性
目录
Java 新特性 ....................................................................................................................................................1
1 Lambda 表达式 ....................................................................................................................................2
1.1 Lambda 语法糖 .......................................................................................................................2
1.1.1 语法 ..............................................................................................................................2
1.1.2 Lambda 表达式可使用的变量 ...............................................................................3
1.1.3 lambda 表达式中的 this 概念.................................................................................3
1.2 函数式接口- Consumer/Predicate/Function/Supplier ..................................................4
1.1.4 什么是函数式接口 ....................................................................................................4
1.1.5 Consumer 接口 ..........................................................................................................5
1.1.6 Function 接口 .............................................................................................................6
1.1.7 Supplier 接口 ..............................................................................................................8
1.1.8 Predicate 接口 ............................................................................................................9
1.3 方法引用和构造器 .............................................................................................................. 12
1.2.1 方法引用................................................................................................................... 12
1.2.2 构造器 ....................................................................................................................... 12
1.4 Stream 语法 .......................................................................................................................... 13
1.3.1 入门案例................................................................................................................... 13
1.3.2 怎么得到 Stream .................................................................................................... 15
1.3.3 转换 Stream ............................................................................................................. 16
1.3.4 汇聚 Stream ............................................................................................................. 19
2 Optional 类......................................................................................................................................... 20
2.1 创建 Optional 容器 ............................................................................................................. 21
2.2 容器简单方法 ....................................................................................................................... 22
2.3 容器进阶方法 ....................................................................................................................... 23
1.3.5 ifPresent 方法 .......................................................................................................... 23
1.3.6 orElseGet 和 orElseThrow 方法 ........................................................................... 23
1.3.7 filter 方法 .................................................................................................................. 24
1.3.8 map 方法 .................................................................................................................. 24
1.3.9 flatMap 方法 ............................................................................................................ 25
2.4 总结 ........................................................................................................................................ 25

1 Lambda 表达式
1.1 Lambda 语法糖
在函数式编程语言中,Lambda 表达式的类型是函数。而在 Java 中,Lambda 表达式是
对象,它们必须依附于一类特别的对象类型——函数式接口(Functional Interface)。
使用 lambda 表达式来创建一个函数式接口实例,那这个 lambda 表达式的入参和返回
必须符合这个函数式接口中唯一的抽象方法的定义。
List<Integer> list = Arrays.
asList
(1,2,3,4,5,6);
list.forEach(new Consumer<Integer>() {
@Override
public void accept(Integer integer) {
System.
out
.println(integer);
}
});
// Lambda 表达式将上面的方式进行改进,接收一个参数 不返回值
list.forEach(s-> System.
out
.println(s));
1.1.1 语法
1) 一般语法
(方法参数) -> 方法实现
(Type1 param1, Type2 param2, ..., TypeN paramN) -> {
statment1;
statment2;
//.............
return statmentM;
}
2) 单参数语法
用于方法只有一个参数情况,可以省略小括号
param1 -> {
statment1;
statment2;
//.............
return statmentM;
}
3) 单语句写法
当 lambda 表达式只包含一条语句时,可以省略大括号、return 和语句结尾的分号
param1 -> statement

4) 方法引用写法(也是 Java8 新特性 后面介绍)
Class or instance :: method
1.1.2 Lambda 表达式可使用的变量
lambda 表达式可以访问给它传递的变量,访问自己内部定义的变量,同时也能访问它
外部的变量。
访问外部变量的限制:变量不可变(只是引用不可变,而不是真正的不可变),隐式的
当作 final 来处理。
// lambda 表达式可使用的变量
// 外部变量,传递变量,内部变量
String outer = "lambda";
List<String> proStr = Arrays.
asList
("hello","world");
List<String> extStr = proStr
.stream()
.map(inner -> {
Long custom = System.
currentTimeMillis
();
return outer + "," + inner + "," + custom;
})
.collect(Collectors.
toList
());
extStr.forEach(System.
out
:: println);
1.1.3 lambda 表达式中的 this 概念
在 lambda 中,this 不是指向 lambda 表达式产生的那个 SAM 对象,而是声明它的外部对象。
public static void main(String[] args) {
Lambda lambda = new Lambda();
// test.Lambda
// test.Lambda
lambda.whatThis();
}
public void whatThis(){
List<String> list = Arrays.
asList
("hello","world");
list
.stream()
.map(s -> {
System.
out
.println(this.getClass().getName());
return s.toUpperCase();
})
.collect(Collectors.
toList
());
}

1.2 函数式接口- Consumer/Predicate/Function/Supplier
type
description
速记
Consumer< T >
接收 T 对象,不返回值
消费者;只消费,无返回值
Predicate< T >
接收 T 对象并返回 boolean
断言,断定;进行判断,返
回 boolean
Function< T, R >
接收 T 对象,返回 R 对象
函数;有返回值,返回对象
Supplier< T >
提供 T 对象(例如工厂),不接收值
提供者;用于提供对象
UnaryOperator
接收 T 对象,返回 T 对象
BinaryOperator
接收两个 T 对象,返回 T 对象
1.1.4 什么是函数式接口
JDK 1.8 API 包含了很多内建的函数式接口,在老 Java 中常用到的比如 Comparator 或
者 Runnable 接口,这些接口都增加了@FunctionalInterface 注解以便能用在 lambda 上。
标注为 FunctionalInterface 的接口被称为函数式接口,该接口只能有一个自定义方法,
但是可以包括从 object 类继承而来的方法。如果一个接口只有一个方法,则编译器会认为
这就是一个函数式接口。
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
…
}

1.1.5 Consumer 接口
@FunctionalInterface
public interface Consumer<T> {
/**
* Performs this operation on the given argument.
* 对给定的参数 T 执行定义的操作,因为没有出参,常用于打印、发送短
信等消费动作
* @param t the input argument
*/
void accept(T t);
// 对给定的参数 T 执行定义的操作执行再继续执行 after 定义的操作
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.
requireNonNull
(after);
return (T t) -> { accept(t); after.accept(t); };
}
}
public class Demo_0 {
public static void main(String[] args) {
Consumer<Integer> consumer1 = (x) -> {
int a = x * x;
System.
out
.println(a);
};
Consumer<Integer> consumer2 = x -> System.
out
.println(x + x);
// accept()方法
consumer1.accept(10);
// andThen()方法,先 accept 20,再 andThen 100
consumer2.andThen(consumer1).accept(10);
}
}
void forEach(Consumer<? super T> action);
List<Integer> list = Arrays.
asList
(1,2,3,4);
list.forEach(System.
out
:: println);
剩余24页未读,继续阅读













安全验证
文档复制为VIP权益,开通VIP直接复制

评论0