Lambda 表达式:在java8语言引入的一种心得语法元素和操作符,这个操作符为 “->” ,该操作符被统称为Lambda操作符或者箭头操作符。它将Lambda分为两个部分:
* -> :lambda操作符,也称箭头操作符 * -> 左边是 lambda形参列表 (接口中抽象方法的形参列表) * -> 右边是 lambda体 (重写的抽象方法的方法体)
- 1
- 2
- 3
Lambda 表达式的本质:作为接口的实例
如果一个接口中,只声明一个抽象方法,则此接口就称为函数式接口
1)可以通过Lambda表达式来创建该接口的对象,(若Lambda表达式抛出一个受检异常(即:非运行时异常),那么该异常需要在目标接口的抽象方法上进行声明
2)我们可以在一个接口上使用@FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口,同时javadoc也会包含一条声明,说明这个接口是一个函数式接口
package com.ldm.java8;
/**
* @author 梁东明
* 2022/9/16
* 人生建议:看不懂的方法或者类记得CTRL + 点击 看看源码或者注解
* 点击setting在Editor 的File and Code Templates 修改
*/
@FunctionalInterface
public interface MyInterface {
void ldm();
}
1)Java从诞生起就一直倡导“万物皆可对象”,在Java里面向对象(OOP)编程是一切,但是随着python、Scala等语言的兴起和挑战,Java不得不作出调整以便支持更加广泛的技术要求,也即Java不但可以支持OOP还可以支持OOF(面向函数编程)
2)在函数式编程语言中,函数被当作一等公民对待,在将函数作为一等公民的编程语言中,Lambda表达式的类型是函数,但是在Java8中,有所不同。在Java8注解,Lambda表达式是对象,而不是函数,它们必须依附于一类特别的对象类型—函数式接口
3)简单地说:在Java8中,Lambda表达式就是一个函数式接口的实例。这就是Lambda表达式和函数式接口的关系。也即是说,只要一个对象是函数式接口的实例 ,那么该对象就可以用Lambda表达式来表达
package com.ldm.java8.Lambda;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
/**
* @author 梁东明
* 2022/9/16
* 人生建议:看不懂的方法或者类记得CTRL + 点击 看看源码或者注解
* 点击setting在Editor 的File and Code Templates 修改
*/
public class LambdaTest02 {
@Test
public void test01(){
SpendMoney(500, new Consumer<Double>() {
@Override
public void accept(Double money) {
System.out.println("去看电影花费了" + money+"元" );
}
});
System.out.println("使用Lambda表达式");
SpendMoney(500, money -> System.out.println("去看电影花费了" + money+"元" ));
}
public static void SpendMoney(double money, Consumer<Double> con){
con.accept(money);
}
@Test
public void test02(){
List<String> list = Arrays.asList("北京","上海","广州","深圳","东莞");
List<String> filter1 = filterString(list, new Predicate<String>() {
@Override
public boolean test(String s) {
return s.contains("京");
}
});
System.out.println("filterString = " + filter1);
System.out.println("====使用Lambda表达式====");
List<String> filter2 = filterString(list, (s -> s.contains("京")));
System.out.println("filter2 = " + filter2);
}
/**
* 过滤字符串
* 根据给定的规则,过滤集合中的字符串,此规则由predicate的方法规定
*
* @param list 列表
* @param predicate 函数式接口的一种
*/
public static List<String> filterString(List<String> list, Predicate<String> predicate){
ArrayList<String> filterString = new ArrayList<>();
for (String s : list) {
if (predicate.test(s)){
filterString.add(s);
}
}
return filterString;
}
}
其他函数式接口
我就不一一实现了
方法引用(method References)
package com.ldm.java8.MethodReferences;
import org.junit.jupiter.api.Test;
import org.omg.PortableInterceptor.INACTIVE;
import java.io.PrintStream;
import java.util.Comparator;
import java.util.function.Consumer;
/**
* @author 梁东明
* 2022/9/16
* 人生建议:看不懂的方法或者类记得CTRL + 点击 看看源码或者注解
* 点击setting在Editor 的File and Code Templates 修改
*
* 方法引用举例在·
*/
public class test {
//对象 :: 实例方法名
@Test
public void test01(){
Consumer<String> con1 = str -> System.out.println(str);
con1.accept("北京");
System.out.println("====使用方法引用====");
PrintStream ps = System.out;
Consumer<String> con2 = ps ::println;
con2.accept("beijing");
}
//类 :: 静态方法
@Test
public void test02(){
Comparator<Integer> c1 = (t1,t2) -> Integer.compare(t1,t2);
int compare = c1.compare(12, 34);
System.out.println("compare = " + compare);
System.out.println("=====方法引用=====");
Comparator<Integer> c2 = Integer ::compare;
int compare1 = c2.compare(12, 34);
System.out.println("compare1 = " + compare1);
}
//类 :: 实例方法名
@Test
public void test03(){
Comparator<String> c1 = (t1,t2) -> t1.compareTo(t2);
int compare = c1.compare("adb", "abd");
System.out.println(compare);
System.out.println("====使用方法引用=====");
Comparator<String> c2 = String::compareTo;
int compare1 = c2.compare("adb", "abd");
System.out.println(compare1);
}
}
为什么要使用StreamAPI
4.2 什么是Stream
注意:
①Stream自己不会存储元素
②Stream不会改变源对象。相反,他们会返回一个持有结果的新Stream
③Stream操作时延迟执行的,这意味着他们呢会等到需要结果的时候才执行
一个数据源(如:集合、数组),获取一个流
一个中间操作链,对数据源的数据进行处理
一旦执行终止操作,就执行中间操作链,并产生结果,之后,就不会再被使用
创建Stream方式1:通过集合
Java8中的Collection接口被扩展,提供了两个获取流的方法
创建Stream的方式二: 通过数组
java8中的Arrays的静态方法stream() 可以获取数组流:
重载形式,能够处理对应基本类型的数组
创建Stream的方式三:通过stream的of()
可以调用Stream类静态方法of(),通过显示值创建一个流,它可以接收任意数量的参数
创建Stream的方式四:创建无限流
可以使用静态方法Stream.iterate() 和Stream.generate(),创建无限流
public static Stream iterate(final T seed,final UnaryOperator f)
public static Stream generate(Supplier s)
1、筛选与切片
2、映射
3、排序
1、匹配与查找
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bmfpEpal-1663430283632)(C:\Users\86139\AppData
2、归约
3、收集
对宋老师的授课内容做的笔记。