zoukankan      html  css  js  c++  java
  • jdk1.8新特性中比较常用的几个介绍

    如果看完觉得对您有帮助到,麻烦关注一下,您的关注是我继续更新的动力。谢谢!!

    函数式接口

    Lambda表达式是如何在java的类型系统中表示的呢?每一个lambda表达式都对应一个类型,通常是接口类型。而“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。因为 默认方法 不算抽象方法,所以你也可以给你的函数式接口添加默认方法。

    我们可以将lambda表达式当作任意只包含一个抽象方法的接口类型,确保你的接口一定达到这个要求,你只需要给你的接口添加 @FunctionalInterface 注解,编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的。

    示例如下:

    @FunctionalInterfaceinterface Converter<F, T> {    T convert(F from);}Converter<String, Integer> converter = (from) -> Integer.valueOf(from);Integer converted = converter.convert("123");System.out.println(converted);    // 123

    需要注意如果@FunctionalInterface如果没有指定,上面的代码也是对的。

    译者注 将lambda表达式映射到一个单方法的接口上,这种做法在Java 8之前就有别的语言实现,比如Rhino JavaScript解释器,如果一个函数参数接收一个单方法的接口而你传递的是一个function,Rhino 解释器会自动做一个单接口的实例到function的适配器,典型的应用场景有 org.w3c.dom.events.EventTarget 的addEventListener 第二个参数 EventListener。

    stream及它关联的方法

     使用lambdas可以支持许多操作,如 map, filter, limit, sorted, count, min, max, sum, collect 等等
    1、filter过滤器
    例子:
    System.out.println("====================jdk1.8版本前新特性Lambda,list遍历======================");
    String[] strArr={"one","tow","three","five"};
    List<String> strList = Arrays.asList(strArr);
    //定义filters
    Predicate<String> strFilter=(str)->(str.length()<=4);
    Predicate<String> filterStr=(s)->(s.length()>3);
    strList.stream()
    .filter(strFilter)
    .filter(filterStr)
    .forEach((strlist)-> System.out.println(strlist));
    }
    测试结果:
    ====================jdk1.8版本前新特性Lambda,list遍历======================
    five
    2、limit返回结果限制
    例子:
    //定义filters
    System.out.println("====================jdk1.8版本前新特性Lambda,list遍历======================");
    String[] strArr={"one","tow","three","five"};
    List<String> strList = Arrays.asList(strArr);
    strList.stream().limit(2).forEach((str)-> System.out.println(str));
    }
    测试结果:
    ====================jdk1.8版本前新特性Lambda,list遍历======================
    one
    tow
    3、排序sorted()
    例子:
    //定义filters
    System.out.println("====================jdk1.8版本前新特性Lambda,list遍历======================");
    String[] strArr={"one","tow","three","five"};
    List<String> strList = Arrays.asList(strArr);
    ArrayList<String> list = new ArrayList<>();
    // strList.stream().limit(2).forEach((str)-> System.out.println(str));
    strList.stream()
    .sorted((str01,str02)->(str01.length()-str02.length()))
    .collect(toList());
    4、获取最大最小值:min()和max()
    System.out.println("====================jdk1.8版本前新特性Lambda,list遍历======================");
    String[] strArr={"one","tow","three","five","eightt"};
    List<String> strList = Arrays.asList(strArr);
    //获取最大和最小
    String s = strList.stream().min((s1, s2) -> (s1.length() - s2.length())).get();
    System.out.println(s);
    System.out.println("========================================");
    String ss=strList.stream().max((s3,s4)->(s3.length()-s4.length())).get();
    System.out.println(ss);
     
    Lambda的使用
     
    1、匿名类的使用
    public class LambdaTest {
    public static void main(String[] args) {
    List<String> names= Arrays.asList("peter","anna","nike","xenia");
    //jdk1.8前的编码
    Collections.sort(names, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
    return o1.compareTo(o2);
    }
    });
    for (String str:names){
    System.out.println(str);
    }
    System.out.println("====================jdk1.8新特性Lambda======================");
    Collections.sort(names,(String a,String b)->{return b.compareTo(a);});
    for (String str:names){
    System.out.println(str);
    }
    System.out.println("====================jdk1.8新特性Lambda,最简表达式======================");
    Collections.sort(names,(a,b)->a.compareTo(b));
    for (String str:names){
    System.out.println(str);
    }
    }
    }
    2、list遍历
    
    
    System.out.println("====================jdk1.8版本前新特性Lambda,list遍历======================");
    String[] strArr={"one","tow","three"};
    List<String> strList = Arrays.asList(strArr);
    for (String str:strList){
    System.out.println(str);
    }
    System.out.println("====================jdk1.8版本新特性Lambda,list遍历,表达式一======================");
    strList.forEach((str)-> System.out.println(str+"; "));
    System.out.println("====================jdk1.8版本新特性Lambda,list遍历,表达式二======================");
    strList.forEach(System.out::println);
    }

     接口的默认方法(非抽象方法)
    1、接口
    package com.bbtree.project.api;


    /**
    * Created by Administrator on 2017/1/3.
    */
    public interface Animal {
    void printName(String animalName);

    default void eat(String animalName){
    System.out.println(animalName+"准备进食");
    }
    default void run(String animalName){
    System.out.println(animalName+"跑起来!");
    }

    }
    2、实现类(只实现抽象方法)
    package com.bbtree.project.api.impl;

    import com.bbtree.project.api.Animal;

    /**
    * Created by Administrator on 2017/1/3.
    */
    public class AnimalImpl implements Animal {
    @Override
    public void printName(String animalName) {
    System.out.println("这是一只"+animalName);
    }
    }
    3、测试类
    public class JDKTest {

    @Test
    public void animalTest(){
    AnimalImpl animal = new AnimalImpl();
    animal.printName("猪");
    System.out.println("========上面为继承方法,下面为jdk1.8中新特性,非抽象方法======");
    animal.eat("猪");
    animal.run("狗");
    }
    }
    4、测试结果
    这是一只猪
    ========上面为继承方法,下面为jdk1.8中新特性,非抽象方法======
    猪准备进食
    狗跑起来!
  • 相关阅读:
    bug-- java.lang.RuntimeException: Type “Klass*"
    ThreadPoolExecutor源码分析二
    ThreadPoolExecutor源码分析一
    java动态代理框架
    liunx 中一个命令可以检测 ps -C java --no-heading| wc -l 一般用于shell脚步编写用
    log4j.properties 使用说明
    图文详解MyEclipse中新建Maven webapp项目的步骤(很详细)
    MySQL高可用性之Keepalived+Mysql(双主热备)
    使用cglib动态创建类,添加方法
    2017年5月5日 星红桉liunx动手实践mysql 主主双机热备
  • 原文地址:https://www.cnblogs.com/chenxqNo01/p/6378279.html
Copyright © 2011-2022 走看看