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