Lambda、Stream、TimerTask
一、Lambda
-
概述
-
Lambda标准格式
public static void main(String[] args) { //labmda其实就是对"方法"的重写。 //(参数类型 参数名)->{代码语句} // ()内的语法与传统方法参数列表一致:无参数则留空,多个参数则用逗号分隔。 // ->是新引入的语法格式,代表指向动作。 // {}内的语法与传统方法体要求基本一致。 new Runnable() { @Override public void run() { System.out.println("runnable"); } }; //lambda:重写run方法 Runnable r = () -> { System.out.println("lambda"); }; //Comparator---> int compare(T o1, T o2); new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o1 - o2; } }; //lambda:重写compare方法 Comparator<Integer> c = (Integer o1, Integer o2) -> { return o1 - o2; }; }
-
Lambda省略格式
-
Lambda应用场景
-
只有函数型接口可用,也就是接口中只有一个抽象方法,也就是说就等着重写的。
-
equals是类都有的,不算那个抽象方法。
-
表达式前面要指明接口类名,编译器才知道重写谁的方法。
二、Stream
-
概述
-
获取 Stream 流
-
Stream 常用方法
private static void method2() { //两个集合 List<String> one = new ArrayList<>(); one.add("迪丽热巴"); one.add("宋远桥"); one.add("苏星河"); one.add("老子"); one.add("庄子"); one.add("孙子"); one.add("洪七公"); List<String> two = new ArrayList<>(); two.add("古力娜扎"); two.add("张无忌"); two.add("张三丰"); two.add("赵丽颖"); two.add("张二狗"); two.add("张天爱"); two.add("张三"); //Stream 使用 Stream.concat( one.stream().filter(name -> name.length() == 3).limit(2), two.stream().filter(name -> name.startsWith("张")).skip(2) ).map(name -> new Person(name)).forEach(p -> System.out.println(p)); }
-
Stream收集数据
public static void main(String[] args) { Stream<Integer> stream = Stream.of(1, 2, 3, 1); //收集到集合 List<Integer> list = stream.collect(Collectors.toList()); System.out.println(list); Stream<Integer> stream2 = Stream.of(1, 2, 3, 1); Set<Integer> set = stream2.collect(Collectors.toSet()); System.out.println(set); //收集到数组 Stream<Integer> stream3 = Stream.of(1, 2, 3); Object[] objs = stream3.toArray(); System.out.println(Arrays.toString(objs)); }
-
想对批量数据(数组或集合)中每一个数据都进行一系列操作可用Stream流。
-
要有终结性的操作才会执行延迟性操作,做了要有收的东西,不然也是白做,浪费时间。
-
stream流方法返回的仍然是stream,所以是可以链式编程的。
-
每一步操作数据都是在往后走的。
-
每一个Stream流都是数据集合。
-
每个stream流只能被收一次。
-
三、TimerTask 按时任务
-
与时间有关的任务,可以设定多久后才执行,也可以设置执行周期等
public static void main(String[] args) { TimerTask tt = new TimerTask() { @Override public void run() { System.out.println("我运行了"); } }; //Timer Timer t = new Timer(); //t.schedule(tt,3000); //delay 多久以后开始执行 period 轮巡周期:每隔多久又运行一次 t.schedule(tt, 1000, 3000); }