lambda-stream流-泛型-字符串
函数式编程
idea功能,跟踪当前流链
lambda
JDK8中的一个语法糖,对某些匿名内部类写法进行简化
匿名内部类 https://blog.csdn.net/cao124383050/article/details/102862120
public static <R> R typeConver(Function<String,R> function){
String str = "12345";
R result = function.apply(str);
return result;
}
public static void main(String[] args) {
//其实相当于省略了一句
//Function<String,Integer> function = new Functionimpl<String, Integer>();
//匿名内部类等于快速给这个接口创建一个实现类,重写接口中的方法
/*Integer result = typeConver(new Function<String, Integer>() {
@Override
public Integer apply(String s) {
return Integer.valueOf(s);
}
});*/
Integer result = typeConver((String s) -> {
return Integer.valueOf(s);
});
System.out.println(result);
String result1 = typeConver(s -> s + "dudu");
//看着懵懵的,怎样快速看懂
//找typeConver,参数有个接口,typeConver方法体里有调用这个接口的方法
//括号里就是这个接口这个方法的重写实现
System.out.println(result1);
}
接口且只有一个方法需要重写可以改写成lambda表达式
参数类型,小括号大括号在一些情况下可以省略
- 参数类型可以省略
- 方法体只有一句代码时大括号return和唯一一句代码的分号可以省略
- 方法只有一个参数时小括号可以省略
stream流
对集合或者数组进行操作
第一步创建流
回忆了一下map
Map提供了一些常用方法,如keySet()、entrySet()等方法,keySet()方法返回值是Map中key值的集合;entrySet()的返回值也是返回一个Set集合,此集合的类型为Map.Entry。
Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry<K,V>。它表示Map中的一个实体(一个key-value对)。接口中有getKey(),getValue方法。
单列集合,数组,双列集合(先转换成单列集合再创建)
中间操作
distinct方法是依赖Object的equals方法(地址值相同)来判断是否是相同对象的。所以需要注意重写equals方法
如果调用空参的sorted()方法,需要流中的元素是实现了Comparable接口
function:两个参数,前面的变成后面的;
Predicate:返回true的留在流中
map只能把一个对象转换成另一个对象来作为流中的元素。而flatMap可以把一个对象转换成多个对象作为流中的元素。
// 打印所有书籍的名字。要求对重复的元素进行去重。
List<Author> authors = getAuthors();
authors.stream()
.flatMap(author -> author.getBooks().stream())
.distinct()
.forEach(book -> System.out.println(book.getName()));
flatmap要注意,每个元素author转换book的list,还需要转换成流返回
终结操作
forEach,min,max,count,collect
anyMatch,allMatch
reduce缩减操作(对流中的数据按照你指定的计算方式计算出一个结果)
两个参数的需要赋初始值,一个参数的默认选流中的第一个值当作初始值(看源码)
stream注意事项:惰性求值;流仅能用一次;对原数据没影响
optional
更优雅地避免空指针异常
ofNullable 把数据封装成一个Optional对象。无论传入的参数是否为null都不会出现问题。
创建对象,
安全地消费值ifPresent
安全获取值orELseGet,orElseThrow
函数式接口
只有一个抽象方法的接口我们称之为函数接口。
@FunctionalInterface注解进行标识
Consumer消费接口:对传入的参数进行操作
Function转换接口:对传入的参数进行转换
supplier生成接口:无参数,只有返回值
predicate判断接口
常用的默认方法
方法引用
简化lambda表达式的语法糖
在使用lambda时,如果方法体中只有一个方法的调用的话(包括构造方法),我们可以用方法引用进一步简化代码
类名或者对象类::方法名
引用类的静态方法
引用对象的实例方法
引用类的实例方法
构造器引用
泛型
可以接收不同类型的参数,进行相同的一组处理,不能使用基本数据类型
Java泛型是一个伪泛型,这是因为Java在编译期间所有泛型信息都会被擦除掉。Java泛型基本上都是在编译器这个层次上实现的,在生成字节码中是不包括泛型中的类型信息
https://blog.csdn.net/Sunshineoe/article/details/110162807
这个学完,把mp的代码简单看一遍,相关不清楚的操作现在一定有新的理解

浙公网安备 33010602011771号