MST

星途 面试题库

面试题:Java Lambda表达式在复杂函数式接口中的应用

假设有一个函数式接口,它的抽象方法接收两个整数列表作为参数,并返回一个新的列表,新列表中的元素是两个输入列表对应位置元素之和(假设两个列表长度相等)。请使用Java Lambda表达式和Stream API来实现这个功能,并解释实现过程中Lambda表达式是如何与函数式接口交互的。
27.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 首先定义函数式接口:
@FunctionalInterface
interface ListAdder {
    List<Integer> addLists(List<Integer> list1, List<Integer> list2);
}
  1. 然后使用Java Lambda表达式和Stream API实现该功能:
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class LambdaStreamExample {
    public static void main(String[] args) {
        List<Integer> list1 = List.of(1, 2, 3);
        List<Integer> list2 = List.of(4, 5, 6);

        ListAdder adder = (l1, l2) -> IntStream.range(0, l1.size())
                                              .mapToObj(i -> l1.get(i) + l2.get(i))
                                              .collect(Collectors.toList());

        List<Integer> result = adder.addLists(list1, list2);
        System.out.println(result);
    }
}
  1. 实现过程中Lambda表达式与函数式接口交互的解释
    • 函数式接口ListAdder定义了一个抽象方法addLists,它接收两个List<Integer>类型的参数并返回一个List<Integer>
    • Lambda表达式(l1, l2) -> IntStream.range(0, l1.size()).mapToObj(i -> l1.get(i) + l2.get(i)).collect(Collectors.toList())实现了ListAdder接口中的addLists方法。
    • 在Lambda表达式中:
      • IntStream.range(0, l1.size())生成一个从0到l1.size() - 1的整数流,这是因为两个列表长度相等,我们可以以此作为索引范围。
      • .mapToObj(i -> l1.get(i) + l2.get(i))对生成的整数流中的每个索引i,从l1l2列表中获取对应位置的元素并求和,将其转换为对象流。
      • .collect(Collectors.toList())将对象流收集为一个List<Integer>,从而得到最终结果。
    • 整个Lambda表达式作为ListAdder接口实现的实例,赋值给adder变量,然后通过adder.addLists(list1, list2)调用该实现来完成两个列表对应位置元素求和的功能。