java8常用的新特性

JDK1.8的新特性
    1.lambda表达式
    2.新日期LocalDateTime.now()
    3.接口中可以定义默认方法和static方法
    4.:: -- 方法引用

1.Lambda表达式
    作用:
      1.实现功能性接口(函数式接口)
      2.对集合进行遍历
    语法:()->{}
    用法1:实现功能/函数式接口
        功能性/函数式接口:接口中只有一个抽象方法,
                   且接口上方有注解@FunctionalInterface
        lambda表达式各部分的意义
            ():重写方法的参数列表
            {}:重写方法的方法体
        lambda表达式各个部分的简化:
           ():
           1.参数列表中的数据类型都可以省略
           2.若参数列表中只有一个参数,此时()可以省略;
               若参数列表无参或者有多个参数,此时()都不可以省略
           {}:
           1.若体部分只有一行代码,此时{}可以省略
           2.若体部分只有一行代码,且有return,此时return也可以省略

-练习:创建一个集合,保存若干个学生对象,要求集合中的元素按照年龄降序排列并输出(使用lambda表达式)

public static void main(String[] args) {
        List<Stu> list=new ArrayList<>();
        Stu stu1=new Stu(3,"tom",23);
        Stu stu2=new Stu(2,"amy",56);
        Stu stu3=new Stu(4,"alp",34);
        Stu stu4=new Stu(5,"iop",14);
        list.add(stu1);
        list.add(stu2);
        list.add(stu3);
        list.add(stu4);
        Collections.sort(list,(o1,o2)->o2.getAge().compareTo(o1.getAge()));
        for (Stu stu : list) {
            System.out.println(stu);
        }
    }


    用法2:对集合进行遍历
        集合若想使用lambda表达式遍历,需要集合对lambda的支持
        支持是指:看集合是否提供forEach(),若有,则可以使用lambda对集合进行遍历 
         - list.forEach(str->System.out.println(str));
         - set.foreach(str->System.out.println(str));
         - map.foreach((k,v)->System.out.println(k+"-"+v));

2.接口中可以定义默认方法和static方法
    JDK1.8之前,接口中有的成员:2种
          - 常量  接口为其提供了默认的修饰符
               public static final
          - 抽象方法 接口为其提供了默认的修饰符
               public abstract
    从JDK1.8开始,允许接口中定义默认方法和static方法
        默认方法需要添加修饰符default
            1.定义默认方法:eg:default void demo()
            2.调用默认方法:通过接口的实现类对象来调用方法
            3.注意点:若一个实现类实现了2个接口,而2给接口中有相同的默认方法,此时在实现类中必须对该方法进行重写,否则编译不通过。
        接口中定义static方法:和平时的static方法定义是相同的
         调用:通过接口名调用static方法即可
    
3.:: -方法引用
    ::是用于简化lambda表达式的,不做其他
        简化的前提:lambda表达式中的参数会作为参数传递给体中调用的方法,且是所有参数都传递给调用的方法。此时就可以使用::来简化lambda表达式
            
            (a,b,c)->{A.test(a,b,c)}
             此时可以使用::简写
                 (a,b,c)->{A::test}
             1.static方法引用  -- 场景:求绝对值
                 1.定义功能性接口
                 2.出现接口作为参数出现
                 3.使用::简写lambda表达式
             2.实例方法引用 -- 将所有字母转换为大写

@FunctionalInterface
public interface StringUtils {
    String toUpper(String str);
}                     
public class StringUtilsTest {
    public String getUpper(String str) {
        return str.toUpperCase();
    }
    public static String toUpperCase(String str, StringUtils utils) {
        return utils.toUpper(str);
    }
    public static void main(String[] args) {
        StringUtilsTest test = new StringUtilsTest();
//        String s = toUpperCase("hello", str -> test.getUpper(str));
         // 使用::简化
        String s = toUpperCase("hello", test::getUpper);
        System.out.println(s);
    }
}


             3.构造方法引用 -- 根据name获取学生对象

@FunctionalInterface
public interface StudentInt {
    Stu getStuByname(String name);
}
public class StuTest {
    public static Stu getStudent(String name,StudentInt studentInt){
        return studentInt.getStuByname(name);
    }
    public static void main(String[] args) {
        //Stu stu = getStudent("tom", name -> new Stu(name));
        // 使用::简化
        Stu stu = getStudent("jack", Stu::new);
        System.out.println(stu);
    }
}


             4.数组的构造方法引用 -- 给出长度获取对应的数组对象

@FunctionalInterface
public interface ArrayUtil {
    int[] getArray(int len);
}
public class ArrayTest {
    public static int[] getArray(int len,ArrayUtil arrayUtil){
        return arrayUtil.getArray(len);
    }
    public static void main(String[] args) {
        //int[] array = getArray(10, len -> new int[len]);
        // 使用::简化
        int[] array = getArray(5, int[]::new);
        System.out.println(Arrays.toString(array));
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值