Java中的类型推断和lambda表达式

简介: Java中的类型推断和lambda表达式

目录



简介


java是强类型的编程语言,每个java中使用到的变量都需要定义它的类型,否则会编译失败。强类型语言的好处就是可以尽可能的在编译期间就发现代码中可能出现的问题,从而减少在运行时出现问题的可能性。


相对的,强类型语言的缺点就是不那么的灵活多变,写起来比较冗余。


JDK8之前,java是不支持类型推断的,在JDK8中,引入了lambda表达式,从此类型推断产生了。


本文将会讲解类型推断在lambda表达式中的最佳实践和在使用中应该注意的事项。

更多精彩内容且看:



更多内容请访问www.flydean.com


类型的显示使用


假如我们定义了一个CustUser类,并且其中有age和name两个属性:


@Data
@AllArgsConstructor
public class CustUser {
    int age;
    String name;
}


看下我们怎么在Stream中显示使用类型:


public static void testStream(){
        Stream.of(new CustUser(10,"alice"), new CustUser(20,"bluce"))
                .forEach( (CustUser custUser)-> System.out.println(custUser.name));
    }


上面的例子中,我们构建了一个CustUser类型的Stream,并在forEach方法中对CustUser进行处理。


forEach接收一个Consumer对象,Consumer需要实现void accept(T t)方法。因为Consumer函数接口,我们可以使用lambda表达式来替换。


这里,我们显示传入一个CustUser类型。代码编译是没有问题的,但是看起来复杂了点。接下来我们看下怎么在Stream中使用类型推断。


Stream中的类型推断


上面的例子,我们可以改写成这样:


public static void testInference(){
        Stream.of(new CustUser(10,"alice"), new CustUser(20,"bluce"))
                .forEach(custUser-> System.out.println(custUser.name));
    }


这里我们并没有定义custUser的类型,但是java可以从Stream中的类型推断出来。所以这样写是没有问题的,可以正常通过编译。


类型推断中变量名字的重要性


上面的例子中,我们将变量的名字定义为custUser,查看代码的人一眼就可以看出来这个参数表示的是CustUser类型的custUser参数。


名字写的有意义可以很大程度上提升代码的可读性和可维护性。如果你这样写:


forEach(u-> System.out.println(u.name)


虽然代码变得更短了,但是失去了可读的意义,一眼看过去,大家并不知道你这个u代表的是什么,从而影响了代码的可读性。


所以变量名的定义一定要有意义。


类型推断对性能的影响


类型推断是个好东西,那么有同学会问了,类型推断对于java的性能会有影响吗?


我们可以把java分成编译和运行两部分。类型推断是在编译期间做的事情,可能使用类型推断会延长代码编译的时间,但是对运行时的效率是没有影响的。


一般来说,我们关注程序的性能问题是在运行时而不是编译时,所以类型推断对性能是没有影响的。


类型推断的限制


java虽然有类型推断,但是这个推断是有一定的限制的,它并不能够像人一样去思考,但是也已经足够智能了。下面我们举个例子:


public static Comparator<CustUser> createUser1(){
        return (CustUser user1, CustUser user2) -> user1.getAge() - user2.getAge();
    }


上面的例子中,我们需要创建一个Comparator,使用lambda表达式我们可以生成一个Comparator。


Comparator需要实现方法int compare(T o1, T o2),传入两个参数,返回一个int。


上面例子中,我们显示指定了两个参数的类型是CustUser,编译没有问题。


如果不显示指定CustUser类型可以吗?


public static Comparator<CustUser> createUser2(){
        return (user1, user2) -> user1.getAge() - user2.getAge();
    }


答案也是可以的。这个例子中,我们并没有传入user1,user2,java是怎么找到user1和user2的类型呢?


注意,上面的例子中,我们定义了返回类型是CustUser的,Java通过这个返回类型来推断出传入的实际类型就是CustUser的。是不是很智能。


如果我们将上面的return语句拆分成两条,会出现问题问题呢?


Comparator comparator=(user1, user2) -> user1.getAge() - user2.getAge();


这时候就会编译报错,说找不到getAge方法。这是因为我们返回的Comparator并没有指明类型,所以默认情况下是Object类型。Object类型并没有getAge方法,所以报错。


我们可以这样改写:


Comparator<CustUser> comparator=(user1, user2) -> user1.getAge() - user2.getAge();


编译完成,没有错误。


总结


除了JDK8中引入的lambda表示中使用了类型推断,其实JDK10中的var本地变量类型也是用到了类型推断,详请参考JDK10的新特性:本地变量类型var

相关文章
|
6天前
|
Java 数据处理 开发者
Java中的Lambda表达式:简化你的代码之路
【8月更文挑战第66天】Lambda表达式在Java 8中首次引入,它为Java开发者提供了一种更简洁、更灵活的编程方式。本文将通过简单易懂的语言和实际代码示例,引导你理解Lambda表达式的基本概念、语法结构以及如何在Java项目中应用它来简化代码。无论你是Java新手还是有经验的开发者,这篇文章都将帮助你更好地掌握这一强大的工具。
34 11
|
6天前
|
Java API
Java中的Lambda表达式:一种简洁而强大的编程工具
本文将深入探讨Java中的Lambda表达式,它是一种简洁而强大的编程工具。通过本文,您将了解Lambda表达式的基本概念、语法结构以及使用方法。我们还将介绍Lambda表达式的应用场景和最佳实践,并通过实例演示其在简化代码、提高可读性和编写并行代码方面的优势。最后,我们将讨论使用Lambda表达式时需要注意的一些事项和限制。无论您是初学者还是有经验的Java开发人员,都可以从本文中获得有价值的知识和技能。现在,让我们一起探索Java中Lambda表达式的奇妙世界吧!
|
8天前
|
存储 安全 Java
Java 数据结构类型总结
在 Java 中,常用的数据结构包括基础数据结构(如数组和字符串)、集合框架(如 Set、List 和 Map 接口的多种实现)、特殊数据结构(如栈、队列和双端队列)、链表(单链表、双链表和循环链表)以及图和树等。这些数据结构各有特点和适用场景,选择时需考虑性能、内存和操作需求。集合框架提供了丰富的接口和类,便于处理对象集合。
|
12天前
|
Java
探索Java中的Lambda表达式
【9月更文挑战第28天】Lambda表达式,这一Java 8引入的轻量级语法结构,为函数式编程提供了强有力的支持。它简化了代码,提高了开发效率,并使得并行处理数据变得异常容易。本文将通过直观的例子和详细的解释,带领读者深入理解Lambda表达式的奥秘,从而在编程实践中更加灵活地运用它们。
|
13天前
|
Java API
探索Java中的Lambda表达式
【9月更文挑战第27天】Lambda表达式,作为Java 8的一大亮点,为我们的编程世界带来了一股清新之风。它以其简洁明了的语法和强大的功能,让我们在处理集合、线程等复杂操作时如鱼得水。本文将带你一探Lambda表达式的奥秘,让你领略到它的魅力所在。
18 6
|
10天前
|
Java 开发者
探索Java中的Lambda表达式:简化你的代码之旅##
【8月更文挑战第62天】 Java 8的发布为开发者带来了诸多新特性,其中最引人注目的无疑是Lambda表达式。这一特性不仅让代码变得更加简洁,还极大地提升了开发的效率。本文将通过实际示例,展示如何利用Lambda表达式来优化我们的代码结构,同时探讨其背后的工作原理和性能考量。 ##
|
11天前
|
Java API 开发者
探索Java中的Lambda表达式
【9月更文挑战第29天】Lambda表达式,在Java编程中,它不仅仅是一种语法糖,更是简化代码、提升效率的利器。本文将通过浅显易懂的语言和实际代码示例,带你走进Lambda的世界,了解其背后的原理和在日常开发中的应用,让你的代码更简洁、更高效。
|
13天前
|
Java API 开发者
探索Java中的Lambda表达式:简化代码,提升效率
【9月更文挑战第27天】在Java 8中引入的Lambda表达式为编程带来了革命性的变化。通过简洁的语法和强大的功能,它不仅简化了代码编写过程,还显著提升了程序的执行效率。本文将深入探讨Lambda表达式的本质、用法和优势,并结合实例演示其在实际开发中的应用。无论你是Java新手还是资深开发者,都能从中获得启发,优化你的代码设计。
|
12天前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
32 2