java8新特性学习笔记(Lambda,stream(),filter(),collect(),map())

1.lambda表达式(重点)

1.需求分析

创建一个新的线程,指定线程要执行的任务

public static void main(String[] args) {
    //开启一个线程
    new Thread(new Runnable() {
      @Override
      public void run() {
        System.out.println("新线程中执行的代码:"+Thread.currentThread().getName());
      }
    }).start();
    System.out.println("主线程中的代码:"+Thread.currentThread().getName());
  }

代码分析:
1.Thread类需要一个Runnable接口作为参数,其中的抽象方法run方法是用来指定线程任务内容的核心
2.为了指定run方法体,不得不需要Runnable的实现类
3.为了省去定义一个Ruunnable的实现类,不得不是使用匿名内部类
4.必须覆盖重写抽象的run方法,所有的发的方法名称,方法参数,方法返回值不得不重写一遍
5.而实际上,我们只在乎方法体的代码

2.Lambda表达式初体验


 new Thread(() -> { System.out.println("新线程Lambda表达式"+ Thread.currentThread().getName());})
                     .start();

Lambda表达式的优点 :简化了匿名内部类的使用,语法更加简单,
匿名内部类的语法冗余,体验了Lambda表达式后发现Lambda表达式是简化匿名内部类的一种方式。

3.Lambda的语法规则

Lambda省去了面向对象的条条框框 lamabda的标准格式由3个部分组成

(参数类型 参数名称) -> {

}
格式说明:
(参数类型 参数名称):参数列表
{代码体}:方法体
->:箭头,分割参数与列表和方法体

3.1 Lambda练习1

练习无参无返回值的Lambda

public interface UserService {
  void goShow();
}

然后创建主方法使用


public class Demo02Lambda {
  public static void main(String[] args) {

    goShow(new UserService() {
      @Override
      public void goShow() {
        System.out.println("show 方法执行了");
      }
    });
    System.out.println("-------------");

    goShow(() -> {
      System.out.println("Lambda Show 方法执行了");
    });
  }
  public static void goShow(UserService userService){
    userService.goShow();
  }
}

输出:

show 方法执行了
-------------
Lambda Show 方法执行了

3.1 Lambda练习2

完成一个有参且有返回值的Lambda表达式

创建一个parson对象

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Parson {
  private String name;

  private int age;
}

在list中保存多个parson对象,然后对这些对象做根据age排序的操作

ublic class Demo03Lambda {
  public static void main(String[] args) {

    List<Parson> list = new ArrayList<>();
    list.add(new Parson("zhou",33));
    list.add(new Parson("zhang",44));
    list.add(new Parson("chen",55));

    Collections.sort(list, new Comparator<Parson>() {
      @Override
      public int compare(Parson o1, Parson o2) {
        return o1.getAge()-o2.getAge();
      }
    });
    for (Parson parson : list){
      System.out.println(parson);
    }
    System.out.println("----------------");

    Collections.sort(list, (Parson o1 ,Parson o2) -> {
      return o1.getAge() - o2.getAge();
    });
    for (Parson parson :list){
      System.out.println(parson);
    }
  }
}

输出结果

Parson(name=zhou, age=33)
Parson(name=zhang, age=44)
Parson(name=chen, age=55)
----------------
Parson(name=zhou, age=33)
Parson(name=zhang, age=44)
Parson(name=chen, age=55)

4.Lambda表达式的原理

匿名内部类在编译的时候会产生一个class文件
Lamabda表达式在程序运行的时候会形成一格类
1.在类中新增了一个方法,这个方法的方法体就是Lambda表达式中的代码
2.还会形成一个匿名内部类,实现接口 ,重写抽象方法
3.在接口中重写方法会调用新生成的方法

5.Lambda表达式的省略写法

在Lambda表达式的标准写法基础上,可以使用省略写法的规则为:
1.小阔号内的参数类型可以省略
2.如果小括号内有且仅有一个参数,则小括号可以省略
3.如果大括号内有且仅有一个语句 可以同时省略大括号retrn关键字及语句分号

6.Lambda表达式的使用前提

Lambda表达式的语法是非常简洁的 但是Lambda表达式不是随便用的,使用时有几个条件要特别注意
1.方法的参数或局部变量类型必须为借口才能是引用Lambda
2.接口与中有且仅有一个抽象方法(@Functionallnterface)

7.Lambdah和匿名内部类的对比

Lambda和匿名内部类的对比
1.所需类型不一样

   1.匿名内部类的类可以是类,抽象类,接口
   2.Lambda表达式需要的类型必须是接口

2.抽象方法的数量不一样

1.匿名内部类所需的接口中的抽象方法的数量是随意的
2.Lambda表达式所需要的接口中只能有一个抽象方法

3.实现原理不一样

1.匿名内部类实在编译后形成一个class
2.Lambda表达式实在程序运行的时候动态生成class

三 stream

1.filter

stream 方法获取指向当前的Collectiond对象的流对象,filter将对流中的元素进行过滤,结合lambda表达式,需要在filter参数中实现一个类似于比较器的predicate对象,返回一个Boolean类型的返回值,只有在返回为true的Collection中的元素才会进入到forEach的循环中

 /**
     * java8新特性,stream方法的filter
     * filter 通过设置的条件过滤元素
     *
     * @param number
     * @return result
     */
    @GetMapping("/filter")
    public List<String> newFeature(String number){
        List<String> result = strArr.stream().filter(str -> !number.equals(str)&&
                !str.equals("")).collect(Collectors.toList());//去除输入的变量返回list
        return  result;
    }

2.map

stream.map()类似于迭代器,结合lambda表达式实现自己的功能,对对象中的某个属性进行提取,或者对对象中的元素进行处理

/**
     * java8新特性,stream方法的map
     * map 对对象中的某个属性进行提取,或对对象中的元素进行处理
     *
     * @param
     * @return names
     */
    @GetMapping("/map")
    public List<String> newFeature(){
        List<TesUser> users = testService.getAll();
        List<String> names = users.stream().map(e -> e.getName()).collect(Collectors.toList());//只返回对象的名字属性
        return names;
    }
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 8引入了Function接口和Lambda表达式,这些新特性使得函数式编程变得更加容易和灵活。 Function接口是一个函数式接口,它定义了一个接受一个参数并返回一个结果的函数。它有一个抽象方法apply(),这个方法接受一个参数并返回一个结果。Function接口有多个默认方法可以组合成复杂的函数链,比如andThen()和compose()方法。 Lambda表达式是一种可以代替匿名内部类的语法,它可以用来创建函数式接口的实例。Lambda表达式由三个部分组成:参数列表、箭头符号和方法体。Lambda表达式的参数列表和方法体可以根据上下文自动推断,这使得代码更加简洁易读。 下面是一个使用Function和Lambda表达式的示例代码: ``` Function<Integer, Integer> square = x -> x * x; int result = square.apply(5); // result = 25 ``` 这个代码定义了一个Function接口的实例square,它接受一个整数参数并返回它的平方。然后我们可以调用这个实例的apply()方法来计算5的平方,结果为25。 Lambda表达式可以用来代替匿名内部类,使得代码更加简洁易读。比如下面这个代码: ``` Runnable runnable = new Runnable() { @Override public void run() { System.out.println("Hello, world!"); } }; ``` 可以使用Lambda表达式来简化为: ``` Runnable runnable = () -> System.out.println("Hello, world!"); ``` 这个代码定义了一个Runnable接口的实例runnable,它的run()方法会输出一条消息。Lambda表达式的箭头符号左侧没有参数,因为run()方法不接受任何参数。箭头符号右侧的方法体只有一条语句,因此可以省略大括号和分号。 总之,Java 8的Function和Lambda表达式为函数式编程带来了更加灵活和易用的工具,使得Java程序员可以更加方便地编写函数式风格的代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值