Lambda
lambda允许函数作为参数传递进方法中。像匿名内部类,就可以通过lambda表达式来表示。
@FunctionalInterface
//要求接口有且只有一个未实现的方法,可以有其他的默认方法
interface AppleFilter {
boolean filter(AppleEntity appleEntity,String color,int weight);
}
List<AppleEntity> eeples = chooseApple(list,(appleEntity,color,weight) -> {
return Objects.nonNull(appleEntity) && StringUtils.equals(color,appleEntity.getColor())
&& appleEntity.getWeight() == weight;
},"green",150);
lambda作用:
-
- 将lambda表达式定义成一个变量,相当于将方法定义成一个变量
- 当匿名内部函数使用
lambda语法表达式的格式如下:
(parameters) -> expression或(parameters) ->{statements; }
以下是lambda表达式的重要特征:
· 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
· 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
· 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
- 可选的返回值:如果主体只有一个表达式,编译器会自动识别返回值,如果加了大括号,需要手动return返回值
变量作用域
方法引用
使用双冒号::
函数式接口
函数名 | 描述 |
Function<T,R> | 输入一个T类型参数,返回一个R类型结果 |
Predicate<T> | 判断函数,输入一个T类型参数,返回一个布尔值 |
Supplier<R> | 无输入参数,返回R类型结果 |
Consumer<T> | 输入一个T类型参数,无返回值 |
默认方法
在接口中,java8可以通过关键字default给方法添加默认实现,类实现该接口时,该方法可以不用被重写。Java7定义的接口要求所有方法都不能被实现,抽象类定义的方法部分可以实现。
public interface TestInterface {
void test1();
default void test2(){
System.out.println("默认实现");
}
}
这样做的好处:当原有接口中新增一个方法,该接口下的所有的类都要重新实现一遍该方法,比方说jdk7中一个接口新增一个方法,对应的所有实现该接口的应用系统都要跟着实现该方法。
Stream
Stream可以理解成对某一数据源中的元素进行聚合操作。数据源可以是集合、I/O channel、产生器generator等。聚合操作类似SQL中的聚合函数:filter、map、reduce、find、sorted等。
Stream分为Stream()串行流;parallelStream()并行流;
public static void main(String[] args) {
Random random = new Random();
random.ints().limit(10).forEach(System.out::println);
}
Optional
Optional内部实现:定义Optional类,Optional类包含属性value,通过判断value值是不是为空进行操作。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。Optional 类的引入很好的解决空指针异常。
Optional optional = Optional.empty();
if (!optional.isPresent()) {
System.out.println("空的optional值不存在");
}
//返回一个非空的optional值,如果传入的value为null,程序运行时会报错
Optional<UserEntity> a = Optional.of(new UserEntity("zhangsan",18));
//如果value值为null,则返回Optional.empty();如果value值不为空,则返回一个非空的optional值
Optional<UserEntity> b = Optional.ofNullable(new UserEntity("zhangsan",18));
//value如果是封装的类对象,如果类对象没重写compotor接口,比较的是hash值,一般都是false
System.out.println(a.equals(b));
//只如果存在,走consumer函数:只传参,无返回值
a.ifPresent(e -> System.out.println(a.get()));