Java中Stream操作

在JDK1.8出现Stream。
通常在数组或者集合的基础上创建stream,stream不会专门存储数据,对stream的操作也不会影响到创建它的数组和集合。

public interface Stream<T> extends BaseStream<T, Stream<T>> 

Stream接口中常用方法如下:

通过集合创建Stream对象:list.stream();
对元素进行筛选: Stream<T> filter(Predicate<? super T> predicate);
收集器,将过滤后的数据进行收集:public <R, A> R collect(Collector<? super T, A, R> collector)
package StreamDemo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

public class TestStream {
    public static void main(String[] args) {
        List<String> list=new ArrayList<>();
        Collections.addAll(list,"ha","hahaba","hai","hello");
        //注意:对stream进行操作方法的返回值不是流的是终结方法
        
        //1.计算list中以ha开头的字符串次数
        System.out.println(list.stream().filter(s->s.startsWith("ha")).count()); // 3  最后一次性计算次数
        //2.将以ha开头的字符串进行收集
        List<String> newList=list.stream().filter(s->s.startsWith("ha")).collect(Collectors.toList());
        System.out.println(newList); //[ha, hahaba, hai]

        //3.判断list是否全部以ha开头
        System.out.println(list.stream().allMatch(s->s.startsWith("ha")));  //false

        //4.判断list中是否有元素以ha开头
        System.out.println(list.stream().anyMatch(s->s.startsWith("ha")));  //true
    }
}

设置取出最大内容: public Stream limit(long maxSize);
跳过的数据量: public Stream skip(long n);
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

public class TestStream {
    public static void main(String[] args) {
        List<String> list=new ArrayList<>();
        Collections.addAll(list,"1.ha","2.hahaba","3.hai","4.hello",
                "5.amazing","6.come","7.run");

        //1.跳过0个,取4个数据,然后进行收集
        System.out.println(list.stream().skip(0).limit(4).collect(Collectors.toList()));
        //[1.ha, 2.hahaba, 3.hai, 4.hello]

        //2.跳过5个,取4个数据,然后进行收集
        System.out.println(list.stream().skip(5).limit(4).collect(Collectors.toList()));
        //[6.come, 7.run]

        //先将元素里包含ha筛选出来然后跳过一个,取两个元素进行收集
        System.out.println(list.stream().filter(s->s.contains("ha")).skip(1).limit(2).
                collect(Collectors.toList())); //[2.hahaba, 3.hai]

        //先将元素跳过1个取10个元素出来进行筛选收集
        System.out.println(list.stream().skip(2).limit(10).filter(s->s.contains("ha")).collect(Collectors.toList()));
        //[3.hai]
    }
}

实例:计算所有商品的总价

package StreamDemo;


import java.util.ArrayList;
import java.util.List;

class Order
{
    private String good;
    private Double price;
    private int count;

    public Order(String good, Double price, int count) {
        this.good = good;
        this.price = price;
        this.count = count;
    }

    public Double getPrice() {
        return price;
    }

    public int getCount() {
        return count;
    }
}

public class TestOrder {
    public static void main(String[] args) {
        List<Order> orderList=new ArrayList<>();
        orderList.add(new Order("芭比",100.7,10));
        orderList.add(new Order("hello kity",204.6,6));
        orderList.add(new Order("水晶鞋",502.1,1));
        orderList.add(new Order("魔仙棒",66.8,3));

        //方法一:用for-each 计算这些商品的总价
        double total=0.0;
        for(Order order:orderList)
        {
            total+=order.getCount()*order.getPrice();
        }
        System.out.println(total); //2937.1

        //方法二:map:计算每一件商品的总价,reduce:将所有商品价格进行汇总
        //ruduce(left,right)---->left=left+right  orElse(0)是指假如是空指针,将值赋为0
        double total1=orderList.stream().mapToDouble(o->o.getCount()*o.getPrice()).reduce((sum,ele)->sum+ele).orElse(0);
        System.out.println(total1); //2397.1
    }
}

对当前结果进行统计分析:

统计方法:DoubleStream mapToDouble(ToDoubleFunction<? super T> mapper);
对mapToDouble进行分析:DoubleSummaryStatistics summaryStatistics();
import java.util.ArrayList;
import java.util.DoubleSummaryStatistics;
import java.util.List;

//将所有商品的单个总价进行统计分析
public class TestOrder {
    public static void main(String[] args) {
        List<Order> orderList=new ArrayList<>();
        orderList.add(new Order("芭比",100.7,10));
        orderList.add(new Order("hello kity",204.6,6));
        orderList.add(new Order("水晶鞋",502.1,1));
        orderList.add(new Order("魔仙棒",66.8,3));

        //进行统计分析
        DoubleSummaryStatistics summaryStatistics=orderList.stream().mapToDouble(o->o.getPrice()*o.getCount()).summaryStatistics();
        //商品种类个数
        System.out.println(summaryStatistics.getCount()); //4
        //所有商品中总价最大的
        System.out.println(summaryStatistics.getMax()); //1227.6
        //所有商品的平均总价
        System.out.println(summaryStatistics.getAverage());//734.275
    }
}

猜你喜欢

转载自blog.csdn.net/sophia__yu/article/details/87188270