lambda和stream

文章目录
  1. 1. 功能性接口的简化
  2. 2. 方法和构造方法的引用
  3. 3. 接口的默认方法
  4. 4. stream

参考文章1

参考文章2

功能性接口的简化

  1. lambda表达式可以简化RunnableComparator这种接口的写法。
/*****lambda表达式简化线程的创建*****/
// 普通写法
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
// do something
}
});
// lambda写法
Thread t2 = new Thread(()->{
// do something
});

/*****lambda表达式简化 Collections.sort 排序*****/
// 普通写法
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
// lambda写法
Collections.sort(list, (x, y) -> x - y);

/*****自定义功能接口*****/
List<String> params = Arrays.asList(new String[]{"app", "red", "blue"});
// 映射List中元素的length集合
List<Integer> res1 = new CollectionUtils<String, Integer>().map(params, (String param) -> param.length());
// 映射list中以元素的大写集合
List<String> res2 = new CollectionUtils<String, String>().map(params, (String param) -> param.toUpperCase());


// 定义函数式接口
@FunctionalInterface
interface MyOP<P, R> {
R apply(P obj);
}
// 集合操作类
class CollectionUtils<P, R> {
// 对集合中的元素进行操作,操作完成之后返回一个新的集合
public List<R> map(List<P> input, MyOP<P, R> myOp) {
List<R> result = new ArrayList();
for (P obj : input) {
result.add(myOp.apply(obj));
}
return result;
}
}
方法和构造方法的引用

// lambda表达式的一般写法
params.forEach((v) -> System.out.print(v + "\t"));
// lambda的简化写法
params.forEach(System.out::print);

// lambda构造方法的简写 Date::new
List<Long> dateValues = Arrays.asList(new Long[] {0L, 1000L});
List<Date> map = new CollectionUtils<Long, Date>().map(dateValues, Date::new);
接口的默认方法

1. 解决了接口的演化问题(接口中新增默认实现方法,不影响原先的实现类)
2. 实现了行为的多继承 (一个类可以实现多个接口的默认方法)
stream

Stream原理:流式操作,由 jdk 内部分配多个线程来执行 stream 内部的操作。并发流使用的默认线程数等于你机器的处理器核心数。

Stream场景:由于 Stream 是由 jdk 内部来为任务分配线程,所以在 一些耗时操作慎用 Stream。

Stream应用:Stream.of()方法,可以接收单个参数,也可以接收一个数组参数,将其转换为一个Stream对象。下面是几个Stream的简单应用demo。


(1)实例代码(forEach方法遍历)->接收一个参数, 通过forEach方法接收一个功能接口。

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Stream.of(list).forEach(System.out::println);
// 输出结果
// [1, 2, 3]

(2)实例代码(forEach方法遍历)->接收一个数组,通过forEach方法接收一个功能接口。

Stream.of(list.toArray()).forEach(System.out::println);
// 输出结果
// 1
// 2
// 3

(3)实例代码(filter方法过滤)-> 找处以小写字母’a’开头的字符串

Stream.of("Abc", "abc", "ccc", "asD")
.filter((str) -> {return str.startsWith("a");})
.forEach(System.out::println);
// 输出结果
// abc
// asD

(4)实例方法->(map方法建立映射)-> 统计给出数组中每个字符串的长度

Stream.of("A", "abc", "cc", "a")
.map((str) -> str.length())
.forEach(System.out::println);
// 输出结果
// 1
// 3
// 2
// 1

(5)实例方法->(reduce方法的使用) -> 初始值为 100,计算初始值加1到5的值

List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
int init = 100;
Integer result = integerList.stream()
.reduce(init, (a, b) -> a + b);
System.out.println("result->" + result);
// 输出结果
// 115