List<Integer> list = Arrays.asList(7, 4, 1, 2); Collections.sort(list, new Comparator<Integer>() { @Override public int compare(Integer a, Integer b) { return a > b ? 1 : (a == b) ? 0 : -1; } }); System.out.println(list);// [1, 2, 4, 7]在Java 8 中就没必要使用这种传统的匿名对象的方式了,Java 8提供了更简洁的语法,lambda表达式:
Collections.sort(list, (Integer a, Integer b) -> { return a > b ? 1 : (a == b) ? 0 : -1; });代码变得更段且更具有可读性,但是实际上还可以写得更短:
Collections.sort(list, (Integer a, Integer b) -> a > b ? 1 : (a == b) ? 0 : -1);对于函数体只有一行代码的,可以去掉大括号{}以及return关键字,但是还可以写得更短点:
Collections.sort(list, (a, b) -> a > b ? 1 : (a == b) ? 0 : -1);Java编译器可以自动推导出参数类型,所以可以不用再写一次类型。
interface Action { void doThing(String param); }
public void func(Action actor) { actor.doThing("Hello World!"); }如果想要调用func()方法,那么通常地做法,给func方法传递一个Action的匿名实现类。如下所示:
new LambdaTest().func(new Action() { @Override public void doThing(String param) { System.out.println("Hi! " + param); } });但是现在有函数接口做参数类型,所以可以用下面的方式调用func ():
new LambdaTest().func((String parm) -> { System.out.println("Hi! " + parm); });甚至可以更简单:
new LambdaTest().func(parm -> System.out.println("Hi! " + parm));
public class Test { public static void main(String[] args) { Formula formula = new Formula() { @Override public double calculate(int a) { return sqrt(a * 100); } }; System.out.println(formula.calculate(100)); // 100.0 System.out.println(formula.sqrt(16)); // 4.0 } } interface Formula { double calculate(int a); default double sqrt(int a) { return Math.sqrt(a); } }
@FunctionalInterface interface Converter<F, T> { T convert(F from); }
Converter<String, Integer> converter = (aa) -> Integer.valueOf(aa); Integer converted = converter.convert("123"); System.out.println(converted); // 123需要注意如果@FunctionalInterface如果没有指定,上面的代码也是对的。
public interface Consumer<T> : void accept(T t);//在T上执行一个操作,无返回结果 public interface Supplier<T> : T get();//无输入参数,返回T的实例 public interface Predicate<T> : boolean test(T t);// 输入参数为T的实例,返回boolean值 public interface Function<T, R> : R apply(T t);// 输入参数为T的实例,返回R的实例
方法引用: