当前位置: 首页 > 知识库问答 >
问题:

Java 8具有流API、Lambda和与Java 7的简明代码比较

龙嘉玉
2023-03-14

我正在学习Java 8的新特性,我遇到了一种情况,在这种情况下,我无法说服面试官Java 8如何提供比旧版本Java更简洁的代码。我提供了一个函数接口和比较器接口的示例,该类不必实现该接口。使用lambda表达式,我们可以直接提供方法的实现,如下面的代码示例1。我已经向他解释了如何使用java8减少行数。

我还提供了比较器接口的示例,我们可以使用lambda表达式直接实现比较器接口。但他说,如果我们用一些类实现比较器接口,那么我可以重用它,同时使用Lambda表达式,无论我做什么排序,我都必须一次又一次地编写逻辑。所以我不知道如何解释java 8如何提供简洁的代码,因为根据他的描述,他是对的。

对于流API,我们也可以对元素进行排序,那么为什么我们应该使用Java8的流API进行排序,而集合有方法集合呢。分类若我使用流API进行排序,那个么我在使用集合时收集了新列表中的所有元素。sort将对现有列表进行排序,那么我们为什么要使用流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);

共有2个答案

翟学文
2023-03-14

我认为这里的关键不是使用Lambda实现比较器,两者都可以。更重要的是,我们的思维方式从Java7中的面向对象编程转变为Java8中的函数式编程。函数编程的关键是将函数视为一级公民,这意味着函数和数据同等重要。它模糊了它们之间的边界,因此函数可以存储在变量中并传递到任何地方(很像C中的函数指针)。然后,您可以在任何地方使用它,并且不受刚性类对象层次的影响。

澹台锐
2023-03-14

但他说,如果我们用一些类实现比较器接口,那么我可以重用它,同时使用Lambda表达式,无论我做什么排序,我都必须一次又一次地编写逻辑。

您只需像第一个示例中那样将lambda捕捉到一个变量中,并在任何地方使用它。这种观点在7个抵制开发人员中很常见,首先告诉他你不必为一个实例构造一个类;其次,比较器代码位于正确的位置,因此读取集合的排序方式不需要搜索排序类的定义;第三,编译器在使用lambda时最擅长优化。。。

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

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

 类似资料:
  • 我有一个复杂的要求,列表中记录有注释。我们有一个报告的功能,每个变化都应该被记录和报告。因此,根据我们的设计,即使单个字段已更新,我们也会创建一个全新的记录。 现在,我们希望将注释的历史记录(按时间戳反向排序)存储在数据库中。运行查询后,我得到了评论列表,但它包含重复的条目,因为其他一些字段被更改。它还包含空条目。 我编写了以下代码来删除重复和空条目。 这个逻辑工作正常,现在已经过测试了,但是我想

  • 我想用Lambda对列表排序: 但我得到了这个编译错误:

  • 我有一颗豆子和一条小溪 并且希望对返回TokenBag的另一个对象流的流应用一些中间操作。在这个例子中必须有两个:("a",3),("b",3)和("a",2)。 请把它看作一个非常简单的例子。在现实中,会有比仅仅计算一行中相同的值更复杂的逻辑。事实上,我试图设计一个简单的解析器,它接受一个令牌流并返回一个对象流。 另外,请注意,它必须保持为一个流(没有中间累加),而且在本例中,它必须在一行中真正

  • 我在windows 7机器上安装了JDK 1.7,在安装JDK 1.8 u20后,出现以下错误: 我的变量指向旧版本(即1.7)。 这里出了什么问题,我如何使用java 8和java 7?

  • Java8简明指南 欢迎来到Java8简明指南。本教程将一步一步指导你通过所有新语言特性。由短而简单的代码示例,带你了解如何使用默认接口方法,lambda表达式,方法引用和可重复注解。本文的最后你会熟悉最新的API的变化如Stream,Fcuntional,Map API扩展和新的日期API。 接口的默认方法 在Java8中,利用default关键字使我们能够添加非抽象方法实现的接口。此功能也被称

  • 任务: null 我的示例的输出: