(参数) -> {
方法体;
return 返回值;
};
lambda可以根据参数,返回值内容不同,简化程度不同:
package com.example.lambda;
interface SumTest {
int sum(int i, int j);
}
interface EmptyTest {
int sum();
}
// FunctionalInterface 检查是否是函数式接口
@FunctionalInterface
interface ManyTest {
int sum(int i);
// 当接口中出现多个未实现方法的时候,就不算函数式接口了,使用lambda会报错
//int add();
// 实现方法,默认返回1
default int add(){return 1;}
}
class SumTestImpl implements SumTest {
@Override
public int sum(int i, int j) {
return i * j;
}
}
/**
* 使用lambda简化实例创建代码
* 1.lambda表达式适用于函数式接口
* 2.函数式接口:接口中只有一个未实现的接口
* 语法:(参数) -> {方法体;返回值;};
*/
public class Lambda {
public static void main(String[] args) {
// 普通方式
SumTestImpl sum = new SumTestImpl();
System.out.println(sum.sum(1, 6));
// 普通方式
SumTest sum1 = new SumTest() {
@Override
public int sum(int i, int j) {
return i * j;
}
};
System.out.println(sum1.sum(2, 6));
// lambda方式:方法体可以自定义
SumTest sumLambda = (int i, int j) -> {
return i * j;
};
System.out.println(sumLambda.sum(3, 6));
// lambda方式,简化参数类型写法
SumTest sumLambda1 = (i, j) -> {
return i * j + i * j;
};
System.out.println(sumLambda1.sum(3, 6));
// 单个参数时,不需要小括号
ManyTest test = i -> {
return i+i;
};
System.out.println(test.sum(3));
// 单个参数,最简写法
test = i -> i+i;
System.out.println(test.sum(3));
// 无参时,直接小括号即可
EmptyTest empty = () -> {
return 1;
};
System.out.println(empty.sum());
}
}
Function中包含着很多函数式接口供我们使用,下面将例举几个:
Function源码如下:
@FunctionalInterface
public interface Function<T, R> {
/**
* Applies this function to the given argument.
*
* @param t the function argument
* @return the function result
*/
R apply(T t);
}
使用示例
Function<Integer, String> function = i -> "使用apply方法,i是入参,此处是返回值"+i;
function.apply(1);
BiConsumer源码如下:
@FunctionalInterface
public interface BiConsumer<T, U> {
/**
* Performs this operation on the given arguments.
*
* @param t the first input argument
* @param u the second input argument
*/
void accept(T t, U u);
}
使用示例
BiConsumer<Integer, String> biConsumer = (c, str) -> System.out.println("使用BiConsumer实现有参,无返回值");
biConsumer.accept(1,"test");
Supplier源码如下:
@FunctionalInterface
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
}
使用示例
var list = new ArrayList<Integer>();
list.add(322);
list.add(452);
list.add(621);
list.add(846);
list.add(223);
Collections.sort(list, Integer::compareTo);
Supplier<List> supplier = () -> list;
System.out.println(supplier.get());
Runnable源码如下:
@FunctionalInterface
public interface Runnable {
/**
* When an object implementing interface {@code Runnable} is used
* to create a thread, starting the thread causes the object's
* {@code run} method to be called in that separately executing
* thread.
* <p>
* The general contract of the method {@code run} is that it may
* take any action whatsoever.
*
* @see java.lang.Thread#run()
*/
public abstract void run();
}
使用示例
Runnable runnable = () -> System.out.println("run起来");
runnable.run();
public static void main(String[] args) {
var list = new ArrayList<Integer>();
list.add(322);
list.add(452);
list.add(621);
list.add(846);
list.add(223);
Collections.sort(list,(o1, o2) -> o1.compareTo(o2));
Collections.sort(list, Integer::compareTo);
}
Integer::compareTo == (o1, o2) -> o1.compareTo(o2),就是引用Integer中的compareTo方法进行排序。
此处可以直接使用”::“进行简化。
判断字符是否为数字,如果是数字就打印出来。
public static void main(String[] args) {
// 使用supplier输出一个字符
Supplier<String> supplier = () -> "111";
// 使用断言判断是否为数字
Predicate<String> predicate = str -> str.matches("\\d+");
// 字符串转数字
Function<String, Integer> function = Integer::parseInt;
// 消费数据
Consumer<Integer> co = c -> {
System.out.println("输入的字符是数字:"+c);
};
String str = supplier.get();
if(predicate.test(str)){
co.accept(function.apply(str));
}else{
System.out.println("输入的字符不是数字");
}
}
java util function包下的所有function定义:
get/test/apply/accept调用的函数方法;