当前位置:   article > 正文

Java8 Runnable Lambda 表达式_java runnable 的lamber

java runnable 的lamber

我们重点来讲讲 Java 8 中的 Runnable Lambda 表达式。众所周知,Java 8 中的 Runable 和 Callable 两个接口都添加了 @FunctionalInterface 注解,因此我们可以直接使用 Lambda 表达式来代替它们的 run() 和 call() 方法


Runnable 表达式

Java 8 开始支持 Lambda 表达式,所以,好像,一夜间,所有添加了 @FunctionalInterface 注解的方法都可以使用 Lambda 表达式来创建实例,Runnable 也不例外,我们可以直接使用一个 Lambda 表达式来创建它的实例

  1. Runnable r = () -> System.out.println("Hello World!");
  2. Thread th = new Thread(r);
  3. th.start();

 运行结果输出为 Hello World ,是不是很神奇,如果没有 Lambda 表达式,那么原来的代码可能如下

  1. Runnable r = new Runnable() {
  2. @Override
  3. public void run() {
  4. System.out.println("Hello World!");
  5. }
  6. };
  7. Thread th = new Thread(r);
  8. th.start();

如果我们的 Lambda 表达式需要多行代码,可以用一对打括号 {} 扩起来,就像下面这样

  1. Runnable r = () -> {
  2. Consumer<Book> style = (Book b) -> System.out.println("Book Id:"+b.getId() + ", Book Name:"+b.getName());
  3. list.forEach(style);
  4. };

如果 Lambda 表达式需要使用到外部的参数,那么必须对参数添加 final 修饰符表示参数不可变更。

  1. final List<Book> list = Arrays.asList(new Book(1, "Ramayan"), new Book(2, "Mahabharat"));
  2. Runnable r = () -> {
  3. Consumer<Book> style = (Book b) -> System.out.println("Book Id:"+b.getId() + ", Book Name:"+b.getName());
  4. list.forEach(style);
  5. };

我们还可以把 Runnable 表达式作为参数传递给 Thread 相关的方法

我们首先来定一个 Book.java 类

Book.java

  1. package cn.twle.util.runnable;
  2. public class Book {
  3. public int id;
  4. public String name;
  5. public Book(int id, String name){
  6. this.id = id;
  7. this.name = name;
  8. }
  9. public int getId() {
  10. return id;
  11. }
  12. public void setId(int id) {
  13. this.id = id;
  14. }
  15. public String getName() {
  16. return name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21. public void print(){
  22. System.out.println("id:"+id + ", Name:"+name);
  23. }
  24. }

然后在一个 Runnable 中输出书籍的一些信息

Java8RunnableDemo.java

  1. package cn.twle.util.runnable;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. import java.util.function.Consumer;
  5. import com.concretepage.Book;
  6. public class Java8RunnableDemo {
  7. public static void main(String[] args) {
  8. final List<Book> list = Arrays.asList(new Book(1, "Ramayan"), new Book(2, "Mahabharat"));
  9. Runnable r1 = () -> list.forEach(Book::print);
  10. Thread th1 = new Thread(r1);
  11. th1.start();
  12. Runnable r2 = () -> {
  13. Consumer<Book> style = (Book b) -> System.out.println("Book Id:"+b.getId() + ", Book Name:"+b.getName());
  14. list.forEach(style);
  15. };
  16. Thread th2 = new Thread(r2);
  17. th2.start();
  18. }
  19. }

运行结果如下

  1. id:1, Name:Ramayan
  2. Book Id:1, Book Name:Ramayan
  3. id:2, Name:Mahabharat
  4. Book Id:2, Book Name:Mahabharat

同样的,我们还可以在 ExecutorService 中运行 Runnable

Java8RunnableDemoExecutor.java

  1. package cn.twle.util.runnable;
  2. import java.util.Arrays;
  3. import java.util.List;
  4. import java.util.concurrent.ExecutorService;
  5. import java.util.concurrent.Executors;
  6. import java.util.function.Consumer;
  7. import com.concretepage.Book;
  8. public class Java8RunnableDemoExecutor {
  9. public static void main(String[] args) {
  10. final List<Book> list = Arrays.asList(new Book(1, "Ramayan"), new Book(2, "Mahabharat"));
  11. ExecutorService service = Executors.newFixedThreadPool(2);
  12. Runnable r1 = () -> list.forEach(Book::print);
  13. service.execute(r1);
  14. Runnable r2 = () -> {
  15. Consumer<Book> style = (Book b) -> System.out.println("Book Id:"+b.getId() + ", Book Name:"+b.getName());
  16. list.forEach(style);
  17. };
  18. service.execute(r2);
  19. }
  20. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/974855
推荐阅读
相关标签
  

闽ICP备14008679号