1.Lambda表达式:
基于Lambda所带来的函数式编程,有引入了一个全新的Stream概念,用于解决集合类库既有的弊端
2.需求:有一个List集合
1.将list集合中姓张的元素过滤到一个新的集合中
2.然后将过滤出来的姓张的元素,在过滤处长度为3的元素,存储到一个新的集合中
public static void main(String[] args) {
// 已知的知识来解决需求
List<String> list = new ArrayList<>();
list.add("张三");
list.add("张三四");
list.add("王五");
list.add("赵六");
list.add("张三三");
list.add("周八");
// 1.将list集合中姓张的元素过滤到一个新的集合中
ArrayList<String> list1 = new ArrayList<>();
for (String name : list) {
// 判断元素是 张 开头的元素,如果是, 就存储到新的集合中
if(name.startsWith("张")){
list1.add(name);
}
}
System.out.println(list1);
// 2.然后将过滤出来的姓张的元素,在过滤处长度为3的元素,存储到一个新的集合中
ArrayList<String> list2 = new ArrayList<>();
for (String name : list1) {
// 判断每个元素的长度是否为3,如果是,就存储到新的集合中
if (name.length() == 3){
list2.add(name);
}
}
System.out.println(list2);
//Stream流操作集合,获取流,过滤操作,打印输出
list.stream().filter((name)->{
return name.startsWith("张");
}).filter((name)->{
return name.length() == 3;
}).forEach((name)->{
System.out.println(name);
});
3.Stream流操作集合,获取流,过滤操作,打印输出
Stream<T> filter(Predicate<? super T> predicate);
-----> 参数:public interface Predicate<T> (函数式接口)
----抽象方法:boolean test(T t);
----> 参数:public interface Consumer<T> (函数式接口)
----抽象方法:void accept(T t);
void forEach(Consumer<? super T> action);
-----> 参数:public interface Consumer<T> (函数式接口)
----抽象方法:void accept(T t);
list.stream().filter((name)->{
return name.startsWith("张");
}).filter((name)->{
return name.length() == 3;
}).forEach((name)->{
});
直接阅读代码的字面意思就可以完美的展示无关逻辑方式的语义:获取流--> 过滤姓张-->过滤长度为3 --> 逐一打印
list.stream().filter((name)->name.startsWith("张")).filter((name)->name.length() == 3).forEach((name)->System.out.println("Stream:"+name) );