0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Java8的新特性

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-10 17:12 次阅读

虽然目前Java最新版本都已经到16了,但是绝大部分公司目前用的Java版本都是8,想当初Java8问世后,其Lambda表达式与方法引用可是最亮眼的新特性,目前,这两个特性也被大家广泛使用,所以今天指北君就带大家看看这两个特性

1.Lambda

从JDK1.8开始为了简化使用者进行代码开发,专门提供有Lambda表达式的支持,利用此操作形式可以实现函数式的编程,对于函数式编程比较著名的语言:haskell,Scala,利用函数式的编程可以避免掉面向对象编程之中的一些繁琐的问题。面向对象在其长期发展的过程中一直有一部分的反对者认为面向对象过于繁琐

比如:

public interface IMessage {
    public void send(String str);
}
public class Demo {
    public static void  main(String args[]){
        IMessage msg = new IMessage() {
            @Override
            public void send(String str) {
                System.out.println("消息发送:"+str);
            }
        };
        msg.send("hahahaha");
    }
}

上面语句的核心功能只有一行核心语句,但是为了这一行核心语句依然需要按照完整的面向对象给出的设计结构进行开发。所以Lambda出现啦。

public interface IMessage {
    public void send(String str);
}
public class Demo {
    public static void  main(String args[]){
       IMessage msg = (str)- >{
           System.out.println("发送消息:"+str);
       };
        msg.send("hahahaha");
    }
}

简单吧,这种形式就避免了复杂的面向对象结构化的要求。

Lambda表达式如果要想使用,那么必须有一个重要的实现要求:SAM(Single Abstract Method)只有一个抽象方法( 但可以有default和static方法 ),以IMessage接口为例,在这个接口里面发现只是提供有一个send()方法,除此之外没有任何其他方法定义,所以这样的接口就被称为 函数式接口 ,而只有函数式接口才可以被Lambda表达式所使用

jdk1.8之后可以在接口里面定义static方法和default方法也是为了函数式编程而设置的,如下面这个是允许的

public interface IMessage {
    public void send(String str);
    public default void defaultMethod(){
        System.out.println("hahahaha");
    };

}
public class Demo {
    public static void  main(String args[]){
       IMessage msg = (str)- >{
           System.out.println("发送消息:"+str);
       };
        msg.send("hahahaha");
        msg.defaultMethod();
    }
}

对于Lambda表达式而言,提供了如下几种格式

1) 方法没有参数:()-->{ };

2) 方法有参数:(参数,参数)-->{ };

  1. 如果现在只有一行语句返回:(参数,参数)-->语句;

我们看下第三种

public interface IMath {
    public int add(int x,int y);
}
public class Demo {
    public static void  main(String args[]){
       IMath math = (t1,t2) - > t1 + t2;
        System.out.println(math.add(10,20));
    }
}

利用Lambda表达式可以使代码更加简便

其中一个很经典的应用就是多线程Runnable接口的例子

public class Test{
    public static void main(String[] args) {
        /*
        匿名内部类的方式
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("nihao");
            }
        }).start();
        System.out.println("你好");
        
        */
        
        
        //lambda的方式
        new Thread(()- > {
            for(int i = 1 ; i< 100 ; i++){
                System.out.println("It is a lambda function!");
            }

        }).start();

    }
}

2.方法引用

引用数据类型最大的特点是可以进行内存的指向处理,但是在传统的开发之中一直所使用的只是对象引用操作,而jdk1.8以后也提供有方法的引用,即:不同的方法名称可以描述同一个方法(即可以为一个方法定义多个名字,但是要求必须是函数式接口)。如果要进行方法的引用在java里面提供了如下的四种形式

1)引用静态方法:类名称 :: static方法名称;

2)引用某个实例对象的方法:实例化对象 :: 普通方法;

3)引用特定类型的方法:特定类 :: 普通方法;

4)引用构造方法:类名称 :: new ;

2.1 引用静态方法

在String类里面提供有String.valueOf( )方法,这个方法就属于静态方法。

方法范例:public static String valueOf(int i),该方法有参数还有返回值

@FunctionalInterface  //函数式接口
public interface IFunction< P,R > {
    public R change(P p);      //p描述的是参数,R描述的是返回值
}
public class Demo {
    public static void  main(String args[]){

        IFunction< Integer , String > fun = String :: valueOf;
        String str = fun.change(100);
        System.out.println(str.length());
    }
}

输出结果为:3

2.2 引用某个实例对象的方法

String类里面有个转大写的方法:public String toUpperCase( )

这个方法是必须在有实例化对象提供的情况下才可以调用

@FunctionalInterface  //函数式接口
public interface IFunction< R > {
    public R upper();
}
public class Demo {
    public static void  main(String args[]){

        IFunction< String > fun = "hahaha" :: toUpperCase;    //"hahaha"为String的实例化对象
        System.out.println(fun.upper());
    }
}

输出结果为:hahaha

2.3 引用特定类型的方法

在方法引用时也可以引用特定类中的一些操作方法,在String里面提供有一个字符串大小关系的比较

比较大小:public int compareTo(String anotherString)

这是一个普通方法,如果要引用普通方法,则往往都需要实例化对象,但是如果说现在你不想给出实例化对象,只是想引用这个方法,则就可以使用特定类来进行引用处理。

@FunctionalInterface  //函数式接口
public interface IFunction< P > {
    public int compare(P p1,P p2);
}
public class Demo {
    public static void  main(String args[]){

        IFunction< String > fun = String :: compareTo ;    //String类中的conpareTo方法
        System.out.println(fun.compare("A","a"));
    }
}

输出结果为:-34

2.4 引用构造方法

public class Person {
    private String name;
    private int age;
    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }
    public String toString(){
        return "姓名:" + this.name + "、年级:" + this.age ;
    }
}
@FunctionalInterface  //函数式接口
public interface IFunction< R > {
    public R create(String s ,int a);
}
public class Demo {
    public static void  main(String args[]){

        IFunction< Person > fun = Person :: new ;    //String类中的conpareTo方法
        System.out.println(fun.create("张三",20));
    }
}

输出结果:姓名:张三、年级:20

提供方法引用的概念更多情况下也只是弥补了对于引用的支持功能。

3 小结

本文介绍了Java8的新特性,lambda和方法引用,其为我们编程带来了便利,所以我们应该需要掌握它。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    102994
  • 编程
    +关注

    关注

    88

    文章

    3440

    浏览量

    92401
  • 函数
    +关注

    关注

    3

    文章

    3868

    浏览量

    61309
  • Lambda
    +关注

    关注

    0

    文章

    26

    浏览量

    9774
收藏 人收藏

    评论

    相关推荐

    controlSuite V3.3.1无法打开

    系统:win7 64bitCCS :6.0.1Javajava7 和 java8的 64bit都安装了求帮忙
    发表于 08-22 06:29

    JAVA学习直通车(教程+书籍+100个实例+问题与解答)

    对于Java8的并行流并不陌生,没错,我们常常用它来执行并行任务,但是由于并行流(parallel stream)采用的是享线程池,可能会对我们的性能造成严重影响,那怎么处理呢?`
    发表于 10-25 14:35

    LocalDateTime、LocalDate、Date之间相互转换

    LocalDateTime 及 LocalDate 是 Java8 的新特性,有时为了兼容 Date 类型需要进行转换。LocalDateTime 转 LocalDate直接调用
    发表于 11-04 07:24

    Java语言的特性有哪些

    开放源代码,读者可以通过分析项目的源代码,提高自己的编程水平。  2 面向对象  面向对象是Java语言的基础,也是Java语言的重要特性,它本身就是一种纯面向对象的程序设计语言。Java
    发表于 12-04 17:07

    Java语言有哪些特性

      Java语言的作者们编写了具有广泛影响的Java白皮书,里面详细地介绍了他们的设计目标以及实现成果,还用简短的篇幅介绍了Java语言的特性。下面将对这些
    发表于 12-14 17:18

    Java语言的特性介绍

      Java语言的作者们编写了具有广泛影响的Java白皮书,里面详细地介绍了他们的设计目标以及实现成果,还用简短的篇幅介绍了Java语言的特性。下面将对这些
    发表于 01-20 14:44

    java8特性

    java8为接口声明添加非抽象方法的实现,也成为拓展方法。
    发表于 11-27 15:54 1620次阅读

    Java语言有哪些特性

    Java语言的作者们编写了具有广泛影响的Java白皮书,里面详细地介绍了他们的设计目标以及实现成果,还用简短的篇幅介绍了Java语言的特性。下面将对这些
    的头像 发表于 05-01 16:08 2816次阅读

    如何利用Stream API来优化Java代码

    使用Stream API优化代码 Java8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简洁易读 放大
    的头像 发表于 07-26 14:30 1141次阅读

    JAVA8提供了Optional类来优化这种写法

    这种写法是比较丑陋的,为了避免上述丑陋的写法,让丑陋的设计变得优雅。JAVA8提供了Optional类来优化这种写法,接下来的正文部分进行详细说明
    的头像 发表于 04-24 15:18 853次阅读

    认识Optional并使用

    的问题之一,那么我们今天就要尽可能的利用Java8的新特性 Optional来尽量简化代码同时高效处理NPE(Null Pointer Exception 空指针异常)。
    的头像 发表于 09-05 14:18 536次阅读

    怎么使用Java8的Stream API比较两个List的差异呢?

    可以使用Java8的Stream API来比较两个List的差异,并取出不同的对象。
    的头像 发表于 08-12 11:15 1584次阅读

    Java8的Stream流 map() 方法

    前言 在日常的开发工作中经常碰到要处理 List 中数据的问题,比如从一个对象集合中获得对象中的一个属性的集合。之前我们想到的是遍历每个元素,然后取出来放到另外一个集合中,比较繁琐;在 Java8
    的头像 发表于 09-25 11:06 716次阅读
    <b class='flag-5'>Java8</b>的Stream流 map() 方法

    为什么需要Streams?它们能取代Java中的for循环吗?

    Java8的发布是Java历史上的一个重大时刻。Streams 和 Lambda 被引入,它们现在被广泛使用。
    的头像 发表于 11-03 09:39 251次阅读
    为什么需要Streams?它们能取代<b class='flag-5'>Java</b>中的for循环吗?