在使用Lambda表达式之前必须了解函数式接口,因为它式在此基础上使用的
public class Lambda02 { public static void main(String[] args) { Consumercon = (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.一个参数,无返回值 Consumercon = (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) { //对象::实例方法 ConsumerStream流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)); }
创建方式
public class Stream01 { public static void main(String[] args) { ArrayList
中间 *** 作
public class Stream02 { public static void main(String[] args) { ArrayListlist = 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) { ListstringList = 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; Optionalb = 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必备.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)