lamba表达式

jdk1.8之前

// 定义接口
interface MyLambaInterface {

    void concatStr(String a, String b);
}

// 实现接口方法 
public class MyLambaInterfaceImpl implements MyLambaInterface {

    @Override
    public void concatStr(String a, String b) {
        System.out.println(a + b);
    }
}

// 调用
public class LambaTest {

     public static void main(String[] args) {
            MyLambaInterface myLambaInterface = new MyLambaInterfaceImpl();
            myLambaInterface.concatStr("zhong", "guo");
    }
}

// 控制台输出 zhongguo

jdk1.8之后

// 函数式接口
@FunctionalInterface
interface MyLambaInterface {

    void concatStr(String a, String b);
}

// 调用
public class LambaTest {

     public static void main(String[] args) {
        MyLambaInterface myLambaInterface = (a, b) -> System.out.print(a + b);
        myLambaInterface.concatStr("zhong", "guo");
    }
}

// 控制台输出 zhongguo

打印集合中以"z"开头的元素

@FunctionalInterface
public interface NameChecker {

    Boolean check(String name);
}

@FunctionalInterface
public interface MyExecutor {

    void executor(String name);
}

public class LambaTest {

    static void checkName(List<String> list, NameChecker checker, MyExecutor executor) {
        for (String s : list) {
            if (checker.check(s)) {
                executor.executor(s);
            }
        }
    }

    public static void main(String[] args) {
        List<String> list = Arrays.asList("zhu", "da", "chang");
        LambaTest.checkName(list, a -> a.startsWith("z"), System.out::print);
    }
}

// 输出 zhu

Java 8中有一个函数式接口的包,里面定义了大量可能用到的函数式接口。所以,我们都不需要定义NameChecker和MyExecutor这两个函数式接口,直接用Java 8函数式接口包里的Predicate<T>和Consumer<T>就可以了。因为他们这一对的接口定义和NameChecker/MyExecutor其实是一样的。

public class LambaTest {

    static void checkName(List<String> list, Predicate<String> predicate, Consumer<String> consumer) {
//        for (String s : list) {
//            if (predicate.test(s)) {
//                consumer.accept(s);
//            }
//        }

        list.forEach(a -> {
            if (predicate.test(a)) {
                consumer.accept(a);
            }
        });
    }

    public static void main(String[] args) {
        List<String> list = Arrays.asList("zhu", "da", "chang");
        LambaTest.checkName(list, a -> a.startsWith("z"), System.out::print);
    }
}

静态方法其实只是对List进行了一通操作,这里我们可以甩掉静态方法,直接使用stream()特性来完成。stream()的几个方法都是接受Predicate<T>,Consumer<T>等参数的。

所以最后只需要一行代码。

public class LambaTest {

    public static void main(String[] args) {
        List<String> list = Arrays.asList("zhu", "da", "chang");

//        LambaTest.checkName1(list, a -> a.startsWith("z"), System.out::print);

        list.stream().filter(a -> a.startsWith("z")).forEach(System.out::print);
    }
}

JDK 1.8 新增加的函数接口:java.util.function

java.util.function 它包含了很多类,用来支持 Java的 函数式编程

Consumer<T> 代表了接受一个输入参数并且无返回的操作

Function<T,R> 接受一个输入参数,返回一个结果

Supplier<T> 无参数,返回一个结果

Predicate<T> 接受一个输入参数,返回一个布尔值结果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiha_zhu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值