Java中的函数式接口-Functional interface

分类: JVM 发布于:

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);