JDK8新特性stream使用笔记

最近在学习Java 8 API 添加的 Stream 的时候 做一些个人笔记,希望帮助自己的同时也能帮到大家。

person类

public class Person {
    private String name;

    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

1、使用forEach()迭代流中的每个数据

@Test
public void testForEach(){
    List<Person> list = new ArrayList<>();
    list.add(new Person("张三", 23));
    list.add(new Person("王五", 25));
    list.add(new Person("李四", 24));
    list.add(new Person("钱七", 27));
    list.add(new Person("赵六", 26));

    list.stream().forEach(person -> {
        System.out.println(person);
    });
}

输出:
在这里插入图片描述

2、使用sorted() 排序数据

@Test
public void testForSort(){
    List<Person> list = new ArrayList<>();
    list.add(new Person("张三", 23));
    list.add(new Person("王五", 25));
    list.add(new Person("李四", 24));
    list.add(new Person("钱七", 27));
    list.add(new Person("赵六", 26));

    System.out.println("排序前===========》");
    list.stream().forEach(person -> {
        System.out.println(person);
    });
    System.out.println("排序后===========》");
    //根据年龄排序
    list.stream().sorted(Comparator.comparing(Person::getAge)).forEach(person -> {
        System.out.println(person);
    });
}

输出:
在这里插入图片描述

3、使用filter()过滤数据

 @Test
 public void testForFilter(){
      List<Person> list = new ArrayList<>();
      list.add(new Person("张三", 23));
      list.add(new Person("王五", 25));
      list.add(new Person("李四", 24));
      list.add(new Person("钱七", 27));
      list.add(new Person("赵六", 26));

      System.out.println("过滤前===========》");
      list.stream().forEach(person -> {
          System.out.println(person);
      });
      System.out.println("过滤后===========》");
      //过滤年龄大于24的
      list.stream().filter((Person person) -> person.getAge() > 24).forEach(person -> {
          System.out.println(person);
      });
  }

输出:
在这里插入图片描述

4、使用limit()进行截断

@Test
public void testForLimit(){
    List<Person> list = new ArrayList<>();
    list.add(new Person("张三", 23));
    list.add(new Person("王五", 25));
    list.add(new Person("李四", 24));
    list.add(new Person("钱七", 27));
    list.add(new Person("赵六", 26));

    System.out.println("截断前===========》");
    list.stream().forEach(person -> {
        System.out.println(person);
    });
    System.out.println("截断后===========》");
    list.stream().limit(3).forEach(person -> {
        System.out.println(person);
    });
}

输出:
在这里插入图片描述

5、map():接收一个方法作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素

@Test
public void testForMap(){
    List<Map<String, Object>> list = new ArrayList<>();
    Map<String, Object> map1 = new HashMap<>();
    map1.put("name", "张三");
    map1.put("age", 23);
    list.add(map1);
    Map<String, Object> map2 = new HashMap<>();
    map2.put("name", "李四");
    map2.put("age", 24);
    list.add(map2);

    List<Person> personList = list.stream().map(map -> {
        Person person = (Person) JSONObject.toBean(JSONObject.fromObject(map), Person.class);
        return person;
    }).collect(Collectors.toList());

    System.out.println("映射前========》");
    list.stream().forEach(person -> {
        System.out.println(person);
    });
    System.out.println("映射后========》");
    personList.stream().forEach(person -> {
        System.out.println(person);
    });
}

输出:
在这里插入图片描述

6 、distinct():使用该方法去重,注意:必须重写对象的hashCode()和equals()方法

 @Override
 public boolean equals(Object o) {
     if (this == o) return true;
     if (o == null || getClass() != o.getClass()) return false;
     Person person = (Person) o;
     return age == person.age &&
             Objects.equals(name, person.name);
 }

 @Override
 public int hashCode() {
     return Objects.hash(name, age);
 }
@Test
public void testForDistinct(){
    List<Person> list = new ArrayList<>();
    list.add(new Person("张三", 23));
    list.add(new Person("张三", 23));
    list.add(new Person("李四", 24));
    list.add(new Person("钱七", 27));
    list.add(new Person("钱七", 28));

    System.out.println("去重前===========》");
    list.stream().forEach(person -> {
        System.out.println(person);
    });
    System.out.println("去重后===========》");
    list.stream().distinct().forEach(person -> {
        System.out.println(person);
    });
}

输出:
在这里插入图片描述

7、skip()

skip(long N)是java.util.stream.Stream对象的方法。此方法以一个长(N)作为参数,并在删除前N个元素后返回流。如果N的值很大,则在有序并行管道上skip()可能会非常昂贵,因为skip(N)被约束为跳过遇到顺序中的前N个元素,而不仅仅是任何n个元素。
注意:如果流包含少于N个元素,则返回空流。

limit()和skip()之间的区别:

limit()方法返回减少的前N个元素流,但skip()方法在跳过前N个元素后返回其余元素流。
limit()是一种短路的有状态中间操作,即,当使用无限输入进行处理时,它可能会生成有限的流,而无需处理整个输入,但是skip()是有状态的中间操作,即,可能需要先处理整个输入产生结果。

limit()和skip()组合应用

1.与subList的替换
集合类如List是有subList()这个方法的,可以截取List中的某一部分,这个功能还可以通过组合skip()和limit()使用得到,如下面代码:

List<Integer> list = asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
List<Integer> expected = list.subList(3, 7);
 
List<Integer> result = list.stream()
  .skip(3)
  .limit(7 - 3)
  .collect(Collectors.toList());
assertEquals(expected, result);

将subList(startIndex, endIndex)转换成skip(startIndex).limit(endIndex - startIndex)。

2.分页
可以通过组合使用skip()和limit()进行分页,如下面代码:

int pageSize = 10;
int pageIndex = 7;

List<Integer> result = Stream.iterate(1, i -> i + 1)
  .skip((pageIndex - 1) * pageSize)
  .limit(pageSize)
  .collect(Collectors.toList());

以上代码例子是获取了第七页数据,每页大小为10。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值