JAVA stream常用语法(不定期更新)

常用语法

基本数据类型集合操作

public static void main(String[] args) throws 
		ClassNotFoundException, 
		NoSuchMethodException {
    setArrayList();
    setIntArrayList();
    //获取长度
    long count=list.stream().count();
    System.out.println("count="+count);
    System.out.println("================去重======================");
    //去重
    list.stream().distinct().forEach(p->System.out.println((p)));
    System.out.println("================获取前2个======================");
    list.stream().limit(2).forEach(p->System.out.println((p)));
    System.out.println("================获取两位数======================");
    list.stream().filter(p->p.toString().length()==2).forEach(p->System.out.println(p));
    System.out.println("================跳过前四个======================");
    list.stream().skip(4).forEach(p->System.out.println((p)));
    System.out.println("================排序======================");
    list.stream().sorted(Comparator.comparing(Student::getAge).reversed()).forEach(p->System.out.println(p.getAge()));
    System.out.println("================0~11最小======================");
    int a= intList.stream().reduce(Integer::min).get();
    System.out.println("0~11最小:"+a);
    System.out.println("================0~11最大======================");
    int b= intList.stream().reduce(Integer::max).get();
    System.out.println("0~11最大:"+b);
}

public static void setIntArrayList(){
    for(int i=11;i>=0;i--){
        intList.add(i);
    }
}

public static void setArrayList(){
    for(int i=11;i>=0;i--){
        Student stu=new Student();
        stu.setAge(i);
        stu.setName("qwqw"+i);
        stu.setNumber(Double.parseDouble(i+"."+i));
        list.add(stu);
    }

}

自定义对象类型集合操作

测试类

public static void main(String[] args) throws 
		ClassNotFoundException, 
		NoSuchMethodException {
		
    //测试转换
    //获取到传来的json字符串
    Student stu=new Student();
    List<Student> students=new ArrayList<>();
    stu.setAge(10);
    stu.setName("name1");
    stu.setNumber(10.00);
    students.add(stu);
    stu=new Student();
    stu.setAge(11);
    stu.setName("name2");
    stu.setNumber(11.00);
    students.add(stu);
    stu=new Student();
    stu.setAge(13);
    stu.setName("name2");
    stu.setNumber(13.00);
    students.add(stu);
    stu=new Student();
    stu.setAge(12);
    stu.setName("name3");
    stu.setNumber(12.00);
    students.add(stu);

    //返回Map(以名称为Key,集合对象为Value)
    Map<String,List<Student>> map=students.stream().collect(Collectors.groupingBy(Student::getName));
    // 分组结果:{name3=[Student{name='name3', age=12, number=12.0}], name2=[Student{name='name2', age=11, number=11.0}, Student{name='name2', age=13, number=13.0}], name1=[Student{name='name1', age=10, number=10.0}]}
    System.out.println("分组结果:" + map);
    //返回Map(以年龄为Key,名称为Value)
    Map<Integer,String> map2 = students.stream().collect(Collectors.toMap(Student::getAge, Student::getName));
    // 分组结果2:{10=name1, 11=name2, 12=name3, 13=name2}
    System.out.println("分组结果2:" + map2);
    //返回Map(以年龄为Key,对象为Value)
    Map<Integer, Student> map3 = students.stream().collect(Collectors.toMap(Student::getAge, item -> item));
    // 分组结果3:{10=Student{name='name1', age=10, number=10.0}, 11=Student{name='name2', age=11, number=11.0}, 12=Student{name='name3', age=12, number=12.0}, 13=Student{name='name2', age=13, number=13.0}}
    System.out.println("分组结果3:" + map3);
    final boolean isBigTen = students.stream().allMatch(p->p.getAge()>10);
    // 年龄是否都大于10:false
    System.out.println("年龄是否都大于10:" + isBigTen);
    //求年龄之和
    LongSummaryStatistics summaryObject = students.stream().collect(Collectors.summarizingLong(Student::getAge));
    // 年龄之和:LongSummaryStatistics{count=4, sum=46, min=10, average=11.500000, max=13}
    System.out.println("年龄之和:" + summaryObject);
    Optional<Integer> sumOp=students.stream().map(Student::getAge).reduce(Integer::sum);
    // 年龄总和:Optional[46]
    System.out.println("年龄总和:" + sumOp);
    Optional<Integer> minOp=students.stream().map(Student::getAge).reduce(Integer::min);
    // 最小年龄:Optional[10]
    System.out.println("最小年龄:" + minOp);
    Optional<Integer> maxOp=students.stream().map(Student::getAge).reduce(Integer::max);
    Integer opop=maxOp.orElse(0);
    // 最大年龄:13
    System.out.println("最大年龄:" + opop);
    //计算平均值
    final Double doubleAverage = students.stream().collect(Collectors.averagingDouble(p -> p.getNumber()));
    // 金额平均值:11.5
    System.out.println("金额平均值:" + doubleAverage);
    final Double intAverage = students.stream().collect(Collectors.averagingInt(p -> p.getAge()));
    // 年龄平均值:11.5
    System.out.println("年龄平均值:" + intAverage);
    List<Student> lal=students.stream().map((p) -> {
           Student st = new Student();
           st.setName("name"+p.getAge());
            return st;
     }).distinct().collect(Collectors.toList());
    // 去重后的名字+年龄数组:[Student{name='name10', age=0, number=0.0}, Student{name='name11', age=0, number=0.0}, Student{name='name13', age=0, number=0.0}, Student{name='name12', age=0, number=0.0}]
    System.out.println("去重后的名字+年龄数组:" + lal.toString());
    List<Student> qqw=students.stream().map((p)->{
        p.setName(p.getName().toUpperCase());
        return p;
    }).collect(Collectors.toList());
    // 去重后的名字大写数组:[Student{name='NAME1', age=10, number=10.0}, Student{name='NAME2', age=11, number=11.0}, Student{name='NAME2', age=13, number=13.0}, Student{name='NAME3', age=12, number=12.0}]
    System.out.println("去重后的名字大写数组:" + qqw);

}

对象实体类

public class Student {

    public String name;

    public int age;

    public double number;

    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;
    }

    public double getNumber() {
        return number;
    }

    public void setNumber(double number) {
        this.number = number;
    }

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

总结

  1. 通过个人对stream和for的性能比较,stream性能一直较差,但是相差不大。
  2. 对于简洁逻辑的集合操作,stream操作代码量比for循环代码量简洁。
  3. stream语法较复杂,易读性较差,简单的集合元素操作逻辑推荐使用stream操作;但是如果操作逻辑复杂,还是推荐使用for操作,易读好维护。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值