Java中的函数式接口-Functional interface
lambda的使用方法介绍。
SAM(Single Abstract Method)
只包含一个抽象方法的接口称为函数式接口。
典型用法如下
Runnable r = new Runnable(){
@Override
public void run() {
System.out.println("My Runnable");
}};
结合lambda方法使用
Runnable task = ()-> System.out.pringln(“My own lambda interface”);
为什么需要lambda表达式
-
减少代码行数。
-
增加串行和并行(parallel)运行方式的支持。
Map<String, Integer> nameMap = new HashMap<>(); Integer value = nameMap.computeIfAbsent(“John”, s -> s.length());
lambda 使用方法
这在python和ruby里非常常见。
函数声明
@FunctionalInterface
public interface ShortToByteFunction {
byte applyAsByte(short s);
}
public byte[] transformArray(short[] array, ShortToByteFunction function) {
byte[] transformedArray = new byte[array.length];
for (int i = 0; i < array.length; i++) {
transformedArray[i] = function.applyAsByte(array[i]);
}
return transformedArray;
}
在java中利用BiFunction实现类似JS中的reduce方法
Map<String, Integer> data = new HashMap<>();
data.put("item-1", 1);
data.put("item-2", 2);
data.put("item-3", 3);
salaries.replaceAll((name, oldValue) ->
name.equals("item-1") ? oldValue : oldValue * 2);
List接口的链式调用
List<String> names = Arrays.asList("zhang","qing", "hua");
List<String> nameWithA = names.stream().filter(name -> name.startsWith("z")).collect(Collectors.toList());
System.out.println(nameWithA.get(0));
经典的reduce方法
List
values = Arrays.asList(3, 5, 8, 9, 12);
int sum = values.stream() .reduce(0, (i1, i2) -> i1 + i2);