【发布时间】:2019-10-04 17:21:53
【问题描述】:
我正在学习 Java 8 的新功能,但遇到了一种情况,我无法说服面试官 java 8 提供的代码比旧版本的 java 更简洁。 我提供了一个功能接口和比较器接口的示例,该类不必实现接口。使用 lambda 表达式,我们可以直接提供方法的实现,如下面的代码 Example1。我已经向他解释了如何使用 java8 减少行数。
我还提供了 Comparator 接口的示例,我们可以使用 lambda 表达式直接实现 Comparator 接口。但是他说如果我们用某个类实现 Comparator 接口,那么我可以在使用 Lambda 表达式时重用它,我必须一次又一次地编写逻辑,每当我要进行排序时。所以我不知道如何解释 java 8 如何提供简洁的代码,因为根据他的描述他是对的。
对于Stream API,我们也可以对元素进行排序,那么为什么要使用Java8的Stream API进行排序,而collection有方法Collections.sort。如果我使用 Stream API 进行排序,那么我已经收集了新列表中的所有元素,而使用 Collections.sort 将对现有列表进行排序,那么我们为什么要使用 Stream API? 请参考示例 3。
所以我无法理解 Java8 如何提供简洁的代码以及流 API 有何帮助,或者我为什么要使用流 API。
我在谷歌上做了一些搜索,但我没有找到任何满意的答案。
//Exaple 1
//Traditional Way
interface SampleInterface {
public void sampleMethod();
}
public class SampleClass implements SampleInterface {
@Override
public void sampleMethod() {
// Implementation Logic
}
}
//Using Lambda expression and Functional Interface
@FunctionalInterface
interface SampleInterface {
public void sampleMethod();
}
public class SampleClass {
public static void main(String[] args) {
SampleInterface sf = () -> {System.out.println("Implementation of interface method");};
}
}
//Example 2
Comparator<Student> c = (s1, s2) -> {return (s1.age < s2.age ? -1 : (s1.age > s2.age) ? 1 : 0 );};
//Example 3
//Using Stream API
List<Employee> newList = empList.stream().sorted((v1, v2) -> (v2.id < v1.id) ? -1 : (v2.id > v1.id) ? 1 : 0).collect(Collectors.toList());
//Using comparator
Collections.sort(list, comparator);
【问题讨论】:
-
Comparator.comparing(Student::getAge)之类的... -
我怀疑问题不在于简洁的代码,而是以一种可以消除冗余的方式设计代码。
-
每当您使用流时,请记住您的代码会产生大量开销(对象创建等)并且可能需要更长的时间来执行。当然,除非您使用具有足够大数据集的并行流。
标签: java lambda java-8 java-stream