- 首先定义函数式接口:
@FunctionalInterface
interface ListAdder {
List<Integer> addLists(List<Integer> list1, List<Integer> list2);
}
- 然后使用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);
}
}
- 实现过程中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
,从l1
和l2
列表中获取对应位置的元素并求和,将其转换为对象流。
.collect(Collectors.toList())
将对象流收集为一个List<Integer>
,从而得到最终结果。
- 整个Lambda表达式作为
ListAdder
接口实现的实例,赋值给adder
变量,然后通过adder.addLists(list1, list2)
调用该实现来完成两个列表对应位置元素求和的功能。