函数式接口
|
调用:
|
Idemo dao = (a)->{}; //Lambda表达式为该接口实例化对象 dao.run(10); int all=Idemo.sum(10, 21); System.out.println(all); dao.say();
Predicate -- 传入一个参数,返回一个bool结果, 方法为boolean test(T t)
这样做了以后感觉 一个Interface和Class 越来越接近了。o(∩_∩)o
在JAVA8中引入一个java.util.function,它可以在方法中直接声明函数并且实现调用。
void accept(T t)
R apply(T t)
T get()
Java 8 引入了流式操作(Stream),通过该操作可以实现对集合(Collection)[也就是包括:list,map,set等]的并行处理和函数式操作,根据操作返回的结果不同,流式操作分为中间操作和最终操作两种。最终操作返回一特定类型的结果,而中间操作返回流本身,这样就可以将多个操作依次串联起来。根据流的并发性,流又可以分为串行和并行两种。流式操作实现了集合的过滤、排序、映射等功能。
集合之流式操作
自己感觉一个Function可以替代其它的三种类型。o(∩_∩)o
Stream 和 Collection 集合的区别:Collection 是一种静态的内存数据结构,而 Stream 是有关计算的。前者是主要面向内存,存储在内存中,后者主要是面向 CPU,通过 CPU 实现计算。
流有串行和并行两种,串行流上的操作是在一个线程中依次完成,而并行流则是在多个线程上同时执行。并行与串行的流可以相互切换:通过 stream.sequential() 返回串行的流,通过 stream.parallel() 返回并行的流。相比较串行的流,并行的流可以很大程度上提高程序的执行效率。
List list = newArrayList(); for(inti = 0; i <1000000;i++){ intnum=(int)(Math.random()*1000); list.add(num); } //获取开始时间点 longstart = System.nanoTime(); //做串行排序 intcount = (int)((Stream)list.stream().sequential()).sorted().count();//串行 //获取结束时间点 longend = System.nanoTime(); longms = TimeUnit.NANOSECONDS.toMillis(end-start); System.out.println("串行:"+ms+"ms"); //并行排序 longstart2 = System.nanoTime(); intcount2 = (int)((Stream)list.stream().parallel()).sorted().count();//并行 longend2 = System.nanoTime(); longms2 = TimeUnit.NANOSECONDS.toMillis(end2-start2); System.out.println("并行:"+ms2+"ms"); //串行:932ms 并行:789ms
该操作会保持 stream 处于中间状态,允许做进一步的操作。它返回的还是的 Stream,允许更多的链式操作。常见的中间操作有:
filter():对元素进行过滤;
sorted():对元素排序;
map():元素的映射;
distinct():去除重复元素;
subStream():获取子 Stream 等。
String [] strs = {"123","s123","465","s456","789"}; List<string> list = Arrays.asList(strs); ist.stream() .filter((s) -> s.startsWith("s"))//中间 .forEach(System.out::println);//终止 |
该操作必须是流的最后一个操作,一旦被调用,Stream 就到了一个终止状态,而且不能再使用了。常见的终止操作有:
forEach():对每个元素做处理;
toArray():把元素导出到数组;
findFirst():返回第一个匹配的元素;
anyMatch():是否有匹配的元素等。
IO/NIO 的改进
Java 8 对 IO/NIO 也做了一些改进。主要包括:改进了 java.nio.charset.Charset 的实现,使编码和解码的效率得以提升,也精简了 jre/lib/charsets.jar 包;优化了 String(byte[],*) 构造方法和 String.getBytes() 方法的性能;还增加了一些新的 IO/NIO 方法,使用这些方法可以从文件或者输入流中获取流(java.util.stream.Stream),通过对流的操作,可以简化文本行处理、目录遍历和文件查找。
新增的 API 如下:
BufferedReader.line(): 返回文本行的流 Stream<String>
File.lines(Path, Charset):返回文本行的流 Stream<String>
File.list(Path): 遍历当前目录下的文件和目录
File.walk(Path, int, FileVisitOption): 遍历某一个目录下的所有文件和指定深度的子目录
File.find(Path, int, BiPredicate, FileVisitOption... ): 查找相应的文件
下面就是用流式操作列出当前目录下的所有文件和目录:
Files.list(newFile(".").toPath()).forEach(System.out::println);
//传统 for (String player : list) { System.out.print(player); } //lambda list.forEach((player)->{System.out.println(player);}); //引用 list.forEach(System.out::println);
new Thread(new Runnable() { @Override public void run (){ System.out.println("Hello world !"); } }).start(); //lambda new Thread(()-> System.out.println("Hello world !")).start();
Arrays.sort(players, new Comparator<String>() { @Override public int compare(String s1, String s2) { return (s1.compareTo(s2)); } }); //lambda Arrays.sort(players,(String s1, String s2) ->(s1.compareTo(s2)));
//筛选R开头的字符串 按字符串的最后一个字符升序 选5条 并且打印出来 list.stream() .filter((str)->str.startsWith("R")) .sorted((String s1,String s2)->(s1.charAt(s1.length() - 1) - s2.charAt(s2.length() - 1))) .limit(5) .forEach(System.out::println); 以上为经典代码,如果理解了也算入门啦!!!