Java8【有与无】【F1】Lambda表达式(高效的并行操作)

1.背景

语言层面上,让代码在多核 CPU 上高效处理批量数据的并行类库。

2.定义

函数式编程:使用不可变值和函数,函数对一个值进行处理,映射成另一个值。它是对行为进行抽象,相对于面向对象的编程方式,它具有更高的性能/效率,线程更安全

Lambda表达式: 一种紧凑的、传递行为的方式,高效并行,简化开发

Lambda表达式能够方便、快捷地创建出这种函数式接口的实例

操作符  参数 -> 要执行的代码

 

2.1.函数式接口说明【知道的可以忽略】

函数式接口: 只能含有一个抽象方法的接口,也称为SAM接口,即Single Abstract Method interfaces。

主要用在Lambda表达式和方法引用

//该注解为函数式接口
//该注解用于编译级错误检查,加上该注解,当你写的接口不符合函数式接口定义的时候,编译器会报错
@FunctionalInterface
public interface Runnable
//定义了一个函数式接口
@FunctionalInterface
interface GreetingService 
{
   void sayMessage(String message);
}


//使用Lambda表达式来表示该接口的一个实现,类似于匿名类的实现
GreetingService greetService1 = 
      message -> System.out.println("Hello " + message);
//函数式接口里可以包含默认方法
//因为默认方法不是抽象方法,其有一个默认实现,所以是符合函数式接口的定义的
//编译器不会报错
@FunctionalInterface
interface GreetingService
{
   void sayMessage(String message);

   default void doSomeMoreWork1()
   {
      // Method body
   }

   default void doSomeMoreWork2()
   {
      // Method body
   }
}

 

//函数式接口里是可以包含静态方法
//因为静态方法不能是抽象方法,是一个已经实现了的方法,所以是符合函数式接口的定义的
@FunctionalInterface
interface GreetingService 
{
   void sayMessage(String message);
   static void printHello()
   {
       System.out.println("Hello");
   }
}
//函数式接口里是可以包含Object里的public方法
//这些方法对于函数式接口来说,不被当成是抽象方法(虽然它们是抽象方法)
//因为任何一个函数式接口的实现,默认都继承Object类,包含来自java.lang.Object里对这些抽象方法的实现
@FunctionalInterface
interface GreetingService  
{
   void sayMessage(String message);
        
   @Override
   boolean equals(Object obj);
}

 

//JDK中的函数式接口举例
java.lang.Runnable,
java.awt.event.ActionListener, 
java.util.Comparator,
java.util.concurrent.Callable
java.util.function包下的接口,如Consumer、Predicate、Supplier等

3.使用方式

  • 无参数,无返回值
  • 有一个参数,并且无返回值
  • 有一个参数,并且有返回值
  • 多个参数的情况
//无参数,无返回值
Runnable r = () -> System.out.println("Thread start...");
new Thread(r).start();

//有一个参数,并且无返回值
//accept:接收参数
Consumer<Integer> consumer = (x) -> System.out.println(x);
// 等价 Consumer<Integer> consumer = x -> System.out.println(x);
consumer.accept(6);

//有一个参数,并且有返回值
//function<T, R> T 入参  R  出参
Function<String, Integer> f = s -> {
    int result = Integer.parseInt(s);
    return result;
};
// 等价 Function<String, Integer> f = s -> Integer.parseInt(s);
Integer num = f.apply("1111");

//多参数
//BiFunction<T, U, R> T, U 入参  R 出参
BiFunction<Integer, Integer, String> b = (x,y) -> x+y+"";//类型推断
// 等价 BiFunction<Integer, Integer, String> b = (Integer x, Integer y) -> x+y+"";
String str = b.apply(1, 2);

/** 对比 **/
/** 遍历Map **/
Map<String, Integer> items = new HashMap<>();
for (Map.Entry<String, Integer> entry : items.entrySet()) {
    System.out.println("Item : " + entry.getKey() + " Count : " + entry.getValue());
}


// 等价

items.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v));
// 或
items.forEach((k,v)->{
    System.out.println("Item : " + k + " Count : " + v);
    if("E".equals(k)){
        System.out.println("Hello E");
    }
});

/** 遍历List **/
List<String> items = new ArrayList<>();
for(String item : items){
    System.out.println(item);
}


// 等价

items.forEach(item->System.out.println(item));
// 或
items.forEach(item->{
    if("C".equals(item)){
        System.out.println(item);
    }
});

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

琴 韵

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

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

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

打赏作者

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

抵扣说明:

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

余额充值