Java 的if语句可以用lambda表达式简化吗?

亲爱的读者,这些Java 8 Interview Questions专门设计用于让您熟悉在面试Java 8 Language时可能遇到的问题的本质。 根据我的经验,很好的面试官在你的面试中几乎不打算问任何特定的问题,通常问题从这个主题的一些基本概念开始,然后他们继续基于进一步的讨论和你回答的问题 -

Java 8中添加了许多功能,最重要的功能如下所述 -

  • Method references - 通过名称引用函数而不是直接调用它们。 使用函数作为参数。

  • New tools - 添加了新的编译工具和实用程序,如'jdeps',以确定依赖关系。

  • Optional - 强调正确处理空值的最佳实践。

除了这些新功能之外,还有很多功能增强功能都是在编译器和JVM级别下完成的。

以下代码使用Java 8 lambda表达式对字符串列表进行排序:

lambda表达式的特征在于以下语法 -

以下是lambda表达式的重要特征 -

  • Optional curly braces - 如果主体包含单个语句,则无需在表达式主体中使用花括号。

  • Optional return keyword - 如果正文具有单个表达式以返回值,则编译器会自动返回该值。 需要使用大括号来表示表达式返回一个值。

Lambda表达式主要用于定义功能接口的内联实现,即仅具有单个方法的接口。 在上面的例子中,我们使用了各种类型的lambda表达式来定义MathOperation接口的操作方法。 然后我们定义了GreetingService的sayMessage的实现。

Lambda表达式消除了对匿名类的需求,并为Java提供了非常简单但功能强大的函数编程功能。

使用lambda表达式,您可以引用最终变量或有效最终变量(仅分配一次)。 如果第二次为变量赋值,则Lambda表达式会抛出编译错误。

方法引用有助于通过名称指向方法。 使用::(双冒号)符号描述方法参考。 方法参考可用于指出以下类型的方法 -

功能界面具有单一功能。 例如,具有单个方法'compareTo'的Comparable接口用于比较目的。 Java 8定义了许多在lambda表达式中广泛使用的函数接口。

它表示一个接受两个输入参数的操作,并且不返回任何结果。

它表示一个接受两个参数并产生结果的函数。

它表示对两个相同类型的操作数的操作,产生与操作数相同类型的结果。

它表示两个参数的谓词(布尔值函数)。

它代表布尔值结果的供应商。

它表示接受单个输入参数并且不返回任何结果的操作。

它表示对两个双值操作数的运算并产生双值结果。

它表示接受单个双值参数并且不返回任何结果的操作。

它表示接受双值参数并生成结果的函数。

它表示一个双值参数的谓词(布尔值函数)。

它代表了双重价值结果的供应商。

它表示一个函数,它接受一个双值参数并产生一个int值结果。

它表示一个函数,它接受一个双值参数并产生一个长值结果。

它表示对单个双值操作数的操作,该操作产生双值结果。

它表示接受一个参数并生成结果的函数。

它表示对两个int值操作数的操作,并产生一个int值结果。

它表示接受单个int值参数并且不返回任何结果的操作。

它表示一个接受int值参数并生成结果的函数。

它表示一个int值参数的谓词(布尔值函数)。

它代表了int值结果的供应商。

它表示一个函数,它接受一个int值参数并产生一个双值结果。

它表示一个函数,它接受一个int值参数并产生一个长值结果。

它表示对单个int值操作数的操作,该操作数生成int值结果。

它表示对两个长值操作数的操作,并产生一个长值结果。

它表示接受单个长值参数并且不返回任何结果的操作。

它表示一个接受长值参数并产生结果的函数。

它表示一个长值参数的谓词(布尔值函数)。

它代表了长期价值的供应商。

它表示一个函数,它接受一个长值参数并产生一个双值结果。

它表示一个函数,它接受一个长值参数并产生一个int值结果。

它表示对单个长值操作数的操作,该操作产生长值结果。

它表示接受对象值和双值参数的操作,并且不返回任何结果。

它表示接受对象值和int值参数的操作,并且不返回任何结果。

它表示接受对象值和长值参数的操作,并且不返回任何结果。

它表示一个参数的谓词(布尔值函数)。

它代表了结果的供应商。

它表示一个函数,它接受两个参数并产生一个双值结果。

它表示产生双值结果的函数。

它表示一个函数,它接受两个参数并产生一个int值结果。

它表示一个产生int值结果的函数。

它表示一个函数,它接受两个参数并产生一个长值结果。

它代表一个产生长值结果的函数。

它表示对单个操作数的操作,该操作产生与其操作数相同类型的结果。

使用java 8,接口可以在接口中具有函数的默认实现。

接口也可以使用Java 8以上的静态帮助器方法。

使用super关键字和接口名称。

Stream表示来自源的一系列对象,它支持聚合操作。

大多数流操作都返回流本身,以便可以对其结果进行流水线操作。 这些操作称为中间操作,它们的功能是获取输入,处理它们并将输出返回到目标。 collect()方法是一个终端操作,通常在流水线操作结束时出现,以标记流的结尾。

与需要显式迭代的集合相比,流操作在内部对提供的源元素进行迭代。

Stream提供了一种新方法'forEach'来迭代流的每个元素。

以下代码段显示如何使用forEach打印10个随机数。

'map'方法用于将每个元素映射到其对应的结果。

以下代码段使用map打印唯一的数字方块。

“过滤器”方法用于根据标准消除元素。

以下代码段使用过滤器打印空字符串计数。

'limit'方法用于减小流的大小。

以下代码段显示了如何打印10个随机数。

'sorted'方法用于对流进行排序。

以下代码段显示如何按排序顺序打印10个随机数。

parallelStream是并行处理流的替代方案。 看一下使用parallelStream打印空字符串计数的以下代码段。

收集器用于组合流的元素的处理结果。 收集器可用于返回列表或字符串。

在Java 8中,引入了统计信息收集器来计算流处理时的所有统计信息。

以下代码将打印列表中的最高编号。

以下代码将打印列表中的最高编号。

以下代码将打印列表中存在的所有数字的总和。

以下代码将打印列表中存在的所有数字的平均值。

可选是一个容器对象,用于包含非null对象。 可选对象用于表示缺少值的null。 此类具有各种实用程序方法,以便于代码将值处理为“可用”或“不可用”,而不是检查空值。 它在Java 8中引入,类似于Guava中的Optional。

对于Nashorn引擎,JAVA 8引入了一个新的命令行工具jjs,用于在控制台执行javascript代码。

本地 - 简化的日期时间API,没有时区处理的复杂性。

Zoned - 专门的日期时间API,用于处理各种时区。

以下代码使用本地日期时间api获取当前日期 -

以下代码使用本地日期时间api将当前日期添加1周 -

以下代码使用本地日期时间api将当前日期添加1个月:

以下代码使用本地日期时间api将当前日期添加1年 -

以下代码使用本地日期时间api将当前日期添加10年 -

下面的代码在下周二使用java8进行 -

以下代码使用java8获得下个月的第二个星期六 -

以下代码以毫秒为单位获取当前日期的瞬间 -

以下代码使用毫秒级的时间获取本地日期时间的瞬间 -

以下代码使用时间毫秒来获取分区日期时间的瞬间 -

此外,您可以查看您对该主题所做的过去作业,并确保您能够自信地说出这些作业。 如果你更新鲜,那么面试官不会指望你会回答非常复杂的问题,而是你必须使你的基本概念非常强大。

正如标题所指定的那样,我有一个旅行列表,一个旅行有一个票证列表,每张票都连接到一个客户。

我想将每个票务客户ID与我的可变客户ID进行比较,以便仅获取该客户的门票,并且我还希望获得该客户有门票的旅行列表。

我想到的代码但无法使其正常工作

下面的内容应该可行 - 虽然未经测试但应该让你接近。

编辑 - 如果您正在尝试获取客户的旅行列表,然后我会以略有不同的方式获取门票列表:

要获得客户所拥有的仅票证

要获得所有旅行,其中至少有一张机票供您的客户使用:

然而,这不会加载门票。如果您还希望使用故障单加载行程,只需添加Include(),如下所示:

Java 目前已经出到13的版本,但是国内大部分公司应该都停留在 Java 8 的版本(不敢承担升级带来的风险)。在Java8中给我们带来了 Lambda表达式和Stream流式操作,提供了函数式编程和简化批处理操作。可能大家日常使用很多,但是很少去关注Lambda 和 Stream实现。本篇就带着大家一起关注这两块知识,搬好小板凳我们一起看电视。

简单来说,编程中提到的 lambda 表达式,通常是指需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。

一般我们使用变量来进行赋值操作:

但是在 Java8 之前是没有提供将一个方法赋值给一个变量的操作:

在 JavaScript 中有 闭包的概念,所以 Java不甘落后,也去学习了人家,搞出了匿名函数的概念。

在Java 8里面,所有的Lambda的类型都是一个接口,而Lambda表达式本身,也就是”那段代码“,需要是这个接口的实现。这是我认为理解Lambda的一个关键所在,简而言之就是,Lambda表达式本身就是一个接口的实现。

// 接收一个参数(数字类型),返回其2倍的值
// 接收2个参数(数字),返回表达式运算的结果
// 多个语句要用大括号包裹, 并且返回值要用return指明
 

Lambda表达式有如下约定:

  • 一个 Lambda 表达式可以有零个或多个参数;
  • 参数的类型既可以明确声明,也可以根据上下文来推断。例如:(int a)与(a)效果相同;
  • 空圆括号代表参数集为空。例如:() -> 42;
  • 当只有一个参数,且其类型可推导时,圆括号()可省略。例如:a -> return a*a;
  • Lambda 表达式的主体可包含零条或多条语句;
  • 如果 Lambda 表达式的主体只有一条语句,花括号{}可省略。匿名函数的返回类型与该主体表达式一致;
  • 如果 Lambda 表达式的主体包含一条以上语句,则表达式必须包含在花括号{}中(形成代码块)。匿名函数的返回类型与代码块的返回类型一致,若没有返回则为空。

@FunctionalInterface 是 Java 8 新加入的一种接口,用于指明该接口类型声明是根据 Java 语言规范定义的函数式接口。Java 8 还声明了一些 Lambda 表达式可以使用的函数式接口,当你注释的接口不是有效的函数式接口时,可以使用 @FunctionalInterface 解决编译层面的错误。

根据定义,函数式接口只能有一个抽象方法,如果你尝试添加第二个抽象方法,将抛出编译时错误。例如:

 

举一个简单使用的例子,首先定义一个接口:

 

这个接口里面只能有一个函数,接口里是返回值为String类型的方法,那么下面使用它的时候就需要有返回值:

 

t就相当于是接口的具体实现,那么使用 t.doSomeThing("print")就会去调用 t 的匿名函数执行。从这段代码看,如果我们有一个抽象类的具体实现逻辑相对简单不用大段代码的时候,可以使用 Lambda 表达式去实现具体的逻辑,这样就不用new 多个类。

Java 8 内置4大核心函数式接口

大家日常使用的List,Map,肯定大量使用了Stream流式处理,在流式处理中大量使用了Lambda,比如List的foreach方法就使用了Lambda表达式。Java8中抽象出来4类基本的函数式接口,日常开发中我们其实也是可以使用的。

R apply(T t):输出T类型的参数返回R类型的结果

以上4种类型是Java默认提供的Lambda类,开箱即用。

 
 
 
 

以上关于Lambda就介绍到这里,大家应该明白了它是干啥的了吧。闭包是不是也没有这么难懂呢!联想到List的foreach使用,大家有没有冲动想自己实现一个Lambda在日常开发中炫一把(如果别人看不懂,会打你的)。

到此这篇关于详解Java中的Lambda表达式的文章就介绍到这了,更多相关Java中的Lambda表达式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

我要回帖

更多关于 java lambda表达式优缺点 的文章

 

随机推荐