【问题标题】:Java 8 features Stream API, Lambda and concise code comparison with java 7Java 8 具有 Stream API、Lambda 以及与 Java 7 的简洁代码比较
【发布时间】: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


【解决方案1】:

但是他说如果我们用一些实现 Comparator 接口 类然后我可以在使用 Lambda 表达式时重用它我必须 每当我要进行排序时,一次又一次地编写逻辑。

您只需像第一个示例中所做的那样将 lambda 捕获到一个变量中,然后在您想要的任何地方使用它。这个论点在 7 位反抗的开发者中很常见,首先告诉他你不必为单个实例构建一个类;其次,比较器代码出现在正确的位置,因此读取集合是如何排序的不需要搜索排序类的定义;第三,编译器在使用 lambdas 时最擅长优化...

对于 Stream API,我们也可以对元素进行排序,那么为什么要使用 Stream Java8排序API

排序正是流式 POV 中不好的功能之一。它只是为了不破坏流:构造流、收集、排序、再次流等

【讨论】:

  • 你是绝对正确的。我们可以将 lambda 表达式放入一个变量中,然后我们可以将它传递到任何地方。我们不必一次又一次地实现相同的逻辑。这是我错过的。
猜你喜欢
  • 2017-10-28
  • 2014-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多