在使用Lambda表达式之前必须了解函数式接口,因为它式在此基础上使用的
public class Lambda02 {
public static void main(String[] args) {
Consumer con = (a) -> System.out.println(a);
con.accept("hello");
Supplier sub = () -> {
int a = 0;
for (int i = 0; i < 10; i++) {
a += i;
}
return a;
};
System.out.println(sub.get());
Function fun = (a) -> {
return a;
};
System.out.println(fun.apply(100));
Predicate pre = (a) -> a<100;
System.out.println(pre.test(99));
List strList = Arrays.asList("北京","南京","普京","上海");
List stringList = filterStr(strList, a -> a.contains("京"));
System.out.println(stringList);
}
//函数作为一个对象传进去 --- Predicate pre 函数对象
public static List filterStr(List list, Predicate pre){
List filterList = new ArrayList<>();
for (String str: list) {
if(pre.test(str)){
filterList.add(str);
}
}
return filterList;
}
}
编写规则
public class Lambda01 {
public static void main(String[] args) {
GreetingService greetingService = new GreetingService(){
@Override
public void sayMessage(String message) {
System.out.println(message);
}
};
greetingService.sayMessage("之前写法");
GreetingService greetingService1 = message -> System.out.println(message);
greetingService1.sayMessage("Lambda写法");
//1.无参,无返回值
Runnable runnable = () -> {
System.out.println("1.无参,无返回值");
};
runnable.run();
//2.一个参数,无返回值
Consumer con = (String a) -> {
System.out.println(a);
};
con.accept("2.一个参数,无返回值");
//3.数据类型省略-类型推断
Consumer con1 = (a) -> {
System.out.println(a);
};
con.accept("3.数据类型省略-类型推断");
//4.一个参数时,小括号可以省略
Consumer con2 = a -> {
System.out.println(a);
};
con.accept("4.一个参数时,小括号可以省略");
//5.两个或以上的参数,多条语句,有返回值
Comparator com = (o1,o2) ->{
System.out.println(o1);
System.out.println(o2);
System.out.println("5.两个或以上的参数,多条语句,有返回值");
return o1.compareTo(o2);
};
//6.若只有一条执行语句,return 和 大括号都可以省略
Comparator com2 = (o1,o2) -> o1.compareTo(o2);
int compare = com2.compare(1, 2);
System.out.println("若只有一条执行语句,return 和 大括号都可以省略");
}
interface GreetingService {
void sayMessage(String message);
}
方法引用
public class MethodRef {
public static void main(String[] args) {
//对象::实例方法
Consumer con = str -> System.out.println(str);
con.accept("bbb");
// PrintStream out = System.out;
Consumer con1 = System.out::println;
con1.accept("aaaa");
//类::静态方法
Comparator com = (t1,t2) -> Integer.compare(t1,t2);
System.out.println(com.compare(12, 3));
Comparator com2 = Integer::compare;
System.out.println(com2.compare(3,12));
//类::实例方法
Comparator cor = (t1,t2) -> t1.compareTo(t2);
System.out.println(cor.compare("a", "b"));
Comparator cor2 = String::compareTo;
System.out.println(cor2.compare("b", "a"));
//数组引用(参考)
Function fun = length -> new String[length];
String[] apply = fun.apply(5);
System.out.println(Arrays.toString(apply));
Function fun2 = String[]::new;
String[] apply1 = fun.apply(5);
System.out.println(Arrays.toString(apply1));
}
Stream流
创建方式
public class Stream01 {
public static void main(String[] args) {
ArrayList
中间操作
public class Stream02 {
public static void main(String[] args) {
ArrayList list = new ArrayList<>(){};
list.add("abc");
list.add("acd");
list.add("bbc");
list.add("bba");
// filter(Predicate super T> predicate) --接收Lambda,从流中过滤某些元素
list.stream().filter(e -> e.contains("a")).forEach(System.out::println);
//limit(n) --阶段流,使其元素不超过给定数量
list.stream().limit(2).forEach(System.out::println);
//skip(n) --跳过元素,返回一个扔掉前n个元素的流,若流中元素不足n个,则返回空流
list.stream().skip(2).forEach(System.out::println);
//distinct() --筛选,通过流所生成元素的hashcode()和equals()去除重复元素
list.stream().distinct().forEach(System.out::println);
List integers = Arrays.asList(1, 2, 3);
//map(Function f) --接收一个函数作为参数,将元素转化为其他形式或者提取信息,该函数会被应用到每个元素
integers.stream().map(e -> e*e).forEach(System.out::println);
//flatMap(Function f) --接收一个函数作为参数,并将流中的每个值都换成另一个流,然后把所有的流连接成一个流
List stringList = Arrays.asList("aa", "bb", "cc");
//如果用map()
Stream> streamStream = stringList.stream().map(Stream02::fromStingToStream);
//如果用flatMap(),可以看到返回的类型不同,如果遍历返回值使用flatMap只需要一层遍历,它自动将里面的集合打开.
Stream characterStream = stringList.stream().flatMap(Stream02::fromStingToStream);
//sorted() --自然排序,需要实现Comparable接口
//sorted(Comparator com) --定制排序,传入一个函数对象自定义排序规则
}
//将字符串中的多个字符构成的集合转换为对应的Stream实例
public static Stream fromStingToStream(String str){
ArrayList list = new ArrayList<>();
for (Character c: str.toCharArray()) {
list.add(c);
}
return list.stream();
}
}
终止操作
public class Stream03 {
public static void main(String[] args) {
List stringList = Arrays.asList("abc", "cba", "aabb");
//allMatch(Predicate p) --检查是否匹配所有元素(都符合规则)
boolean b = stringList.stream().allMatch(e -> e.contains("a"));//都包含"a"为 true
//anyMatch(Predicate p) --检查是否至少匹配一个元素(有一个即可)
boolean b1 = stringList.stream().anyMatch(e -> e.contains("c"));//有一个包含"c"为 true
//noneMatch(Predicate p) --检查是否没有匹配的元素
boolean b2 = stringList.stream().noneMatch(e -> e.startsWith("c"));//没有以"d"开头才为 true
//findFirst --返回第一个元素
//findAny --返回当前流的任意元素
//count --返回当前流的元素总个数
//max(Comparator c) --返回流中最大值
//min(Comparator c) --返回流中最小值
Optional min = stringList.stream().min(String::compareTo);
System.out.println(min);
//forEach(Consumer c) --内部迭代
//T reduce(T identity, BinaryOperator accumulator) --可以将流中的元素反复结合起来,得到一个值,返回 T identity是一个初始值.
List integers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Integer reduce = integers.stream().reduce(0, Integer::sum);
System.out.println(reduce);
//Optional01 reduce(BinaryOperator accumulator) --可以将流中的元素反复结合起来,得到一个值,返回Optional
//collect(Collector c) --将流转换为其他形式,接收一个Collector接口的实现,用于给Stream中的元素做汇总方法
Set collect = integers.stream().filter(e -> e < 5).collect(Collectors.toSet());
}
}
总结:
- 1.Stream关注的是对数据的计算,与CPU打交道,
- 集合关注的是数据的存储,与内存打交道
- 2.Stream自己不会存储数据
- Stream不改变原对象,相反,它会返回一个持有结果的新的Stream
- Stream是延迟操作的,需要结果的时候才会执行
- 3.Stream的执行流程:Stream实例化 -> 一系列的中间操作(过滤、映射等) -> 终止操作
- 4.说明:
- Stream一个中间操作链对数据源数据进行处理
- 一旦执行终止操作,就执行中间操作链,并产生结果,之后便不再被使用.
public class Optional01 {
public static void main(String[] args) {
Boy boy = new Boy();
Boy boy1 = null;
Optional b = Optional.of(boy);
Optional b1 = Optional.empty();
Optional b3 = Optional.ofNullable(boy1);
}
public static String getName(Boy boy){
Optional boy1 = Optional.ofNullable(boy);
Boy boy2 = boy1.orElse(new Boy("男神"));
return boy2.getName();
}
}
注: 以上内容装13必备.



