java函数式编程Lambda基础
- LambdaJava 8引入了Lambda语法,用以简化单抽象方法接口的实现
- Lambda语法实现了类型自动推断
- 只定义了单个(只有一个抽象方法)抽象方法接口被称为函数式接口,标注为@FunctionalInterface
- 重写(继承的)的不算
方法引用
- 如果某个方法签名和接口方法恰好一致(参数类型和返回类型): 可以直接传入方法引用列: String::compareTo
- 引用静态方法(参数列表类型和返回类型一致)
Arrays.sort(its, Comparator.comparingInt(o -> o));
- 使用构造函数(构造参数和stream的泛型一致 并且 构造的类型是返回值的类型)
String str = "hello,word,test,os,";
List<String> strList = Arrays.asList(str.split(","));
strList.stream().map(Student::new).collect(Collectors.toList());
stream
创建
- String.of(1,2,3);
- Arrays.stream(list);
- list.stream(); map.stream()
map 通过元数据应生成一个新的stream
String str = "hello,word,test,os,";
List<String> strList = Arrays.asList(str.split(","));
List<Student> stuList = strList.stream().map(Student::new).collect(Collectors.toList());
filter 是一个stream的转换方法, 把一个stream转换成另一个stream
reduce 聚合函数 第一个元素和后面的元素做计算的累计 例如:i = i + n; i = i - n; i = i * n;
排序 sorted();
去除重复 distinct()
limit() 截取多少元素
skip() 跳过多少元素
contact() 将两个stream合并成一个stream
flatMap 把元素映射为stream然后合并成一个新的stream : Stream<List<Integer>>
parallel 变成一个可以并行处理的stream,后续的操作可以并行操作
count 元素个数
min 最小元素
max 最大元素
sum 求和
average 求平均数
allMatch 是否所有匹配
forEach 循环
toArray 转换为Object数组
collect 可以换为list set等集合
code
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class TestSort {
public static void main(String[] args) {
// 排序数组
Integer[] its = {2, 3, 7, 4, 2, 1, 0, 8, 5, 9, 9, 9};
Arrays.sort(its, Comparator.comparingInt(o -> o));
Stream<Integer> stream = Stream.of(its);
stream.forEach(System.out::print);
System.out.println();
// 数组去重 list去重
List<Integer> list = Stream.of(its).distinct().collect(Collectors.toList());
list.forEach(System.out::print);
// map 通过元数据应生成一个新的stream
String str = "hello,word,test,os,";
List<String> strList = Arrays.asList(str.split(","));
// Arrays.sort(strList, String::compareToIgnoreCase);
List<Student> stuList = strList.stream().map(Student::new).collect(Collectors.toList());
stuList.forEach(System.out::println);
System.out.println("filter过滤:");
List<Student> stuListFilter = strList.stream().filter((s) -> s.contains("t")).map(Student::new).collect(Collectors.toList());
stuListFilter.forEach(System.out::println);
System.out.println("使用reduce进行累加");
Optional<Integer> sum = Stream.of(1, 2, 3).reduce((a, b) -> a + b);
System.out.println(sum.get());
System.out.println("stream sorted排序");
List<Integer> b = Arrays.stream(its).sorted().collect(Collectors.toList());
b.forEach(System.out::print);
}
}
来源:oschina
链接:https://my.oschina.net/osmoon/blog/3219555