JAVA8新特性

函数式接口

1.接口上使用注解 @FunctionalInterface 表示当前使用的为函数式接口,该接口下必须实例化一个 public void 函数名(参数可选);的方法,已便于将来使用Lambda表达式为该接口实例化对象所用,相当于一个类的无参数的构造方法一样 。

2.新增接口中可以声明静态方法,可以使用:接口名.静态方法名来实现调用。

3.新增default关键字的默认方法,该方法需实例化接口对象后调用。
     例如: 

FunctionalInterface
public interface Idemo{
    void run(int a);
    static  int sum(int a,int b){
       return a+b;
    }
    default  void say(){
      System.out.println("hello world!!!");
    }
} 

调用:

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,它可以在方法中直接声明函数并且实现调用。

  • Consumer -- 传入一个参数,无返回值。 方法为void accept(T t)
  • Function -- 传入一个参数,返回一个结果,方法为R apply(T t)
  • Supplier -- 无参数传入,返回一个结果,方法为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);


全球化功能
新的 java.time中包含了所有关于时钟(Clock),本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime)和持续时间(Duration)的类。大大简化API和本地话管理的问题。


安全性

主要是禁用一些安全性较差的加密算法。

Lambda 表达式(重要)

Lambda 表达式使并行操作大集合变得很方便,可以充分发挥多核 CPU 的优势,更易于为多核处理器编写代码;
( 多个参数值逗号分割 )-> 返回ture或false的表达式
或者

( 多个参数值逗号分割 )-> {程序代码块}

java的Lambda都是要在collection和函数式接口中做使用不能直接 ()->5;这是不允许的。
//传统
for (String player : list) {  
  System.out.print(player);  
}  
//lambda
list.forEach((player)->{System.out.println(player);});
//引用
list.forEach(System.out::println);

 以上3种都可以达到相同的效果
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)));

   以上代码可看出不同?注意红色块!!!是否找到规律了呢? o(∩_∩)o 
//筛选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);
以上为经典代码,如果理解了也算入门啦!!! 


 
原文摘抄自:http://www.ibm.com/developerworks/cn/java/j-lo-jdk8newfeature/index.html 略作修改。

你可能感兴趣的:(java,java8,新特性,lambda表达式,函数式)