/**
* 只有一个抽象方法 函数变成更加灵活
* 1 消费形状接口 {@link java.util.function.Consumer} void accept(T t);
* 2 供给型接口 {@link java.util.function.Supplier} T get();
* 3 函数型接口 T操作类型,R结果类型 {@link java.util.function.Function} R apply(T t);
* 4 断定型接口 T操作对象类型,返回boolean值 {@link java.util.function.Predicate} boolean test(T t);
*
* @author eden on 2022/11/28
*/
// 标记是函数式接口
@FunctionalInterface
public interface FunctionalTest {
void m1();
default void m2() {
}
}
/**
* 方法引用
* 当要传递给lambda体的操作,已经有方法实现了
* 接口中的抽象方法形参和返回值类型一样 Supplier<String> return String
*
* @author eden on 2022/11/28
*/
public class FunctionalMainTests {
/**
* 消费形状接口 {@link java.util.function.Consumer} void accept(T t);
* 消费形状接口
* 对象::方法
*/
@Test
public void m1() {
Consumer<String> consumer = System.out::println;
consumer.accept("拼接....");
}
/**
* 供给型接口 {@link java.util.function.Supplier} T get();
*/
@Test
public void m2() {
Supplier<String> supplier = () -> "供给者";
System.out.println(supplier.get());
}
/**
* {@link Comparable 排序器}
*/
@Test
public void m3() {
// 比较器
Comparator<Integer> com = Integer::compare;
System.out.println(com.compare(2, 10));
System.out.println(com.compare(10, 2));
System.out.println(com.compare(10, 10));
}
/**
* 函数型接口 T操作类型,R结果类型 {@link java.util.function.Function} R apply(T t);
*/
@Test
public void m4() {
Function<Double, Long> fun = Math::round;
// 四舍五入
System.out.println(fun.apply(12.3));
System.out.println(fun.apply(12.7));
}
/**
* t1.compareTo(t2)
*/
@Test
public void m5() {
// t1.compareTo(t2)
Comparator<String> com = String::compareTo;
System.out.println(com.compare("abc", "aaa"));
}
/**
* 断定型接口 T操作对象类型,返回boolean值 {@link java.util.function.Predicate} boolean test(T t);
*/
@Test
public void m6() {
BiPredicate<String, String> predicate = String::equals;
System.out.println(predicate.test("abc", "abc"));
}
@Test
public void m7() {
// 原数组
List<String> strings = Arrays.asList("北京", "南京");
System.out.println(filterString(strings, s -> s.contains("北")));
}
/**
* 根据规则过滤
*
* @param list 原字符串
* @param predicate 规则
* @return list
*/
private List<String> filterString(List<String> list, Predicate<String> predicate) {
ArrayList<String> strings = new ArrayList<>();
for (String s : list) {
if (predicate.test(s)) {
strings.add(s);
}
}
return strings;
}
}