java8 stream 流 例子

 

 1 Trader raoul = new Trader("Raoul", "Cambridge");
 2 Trader mario = new Trader("Mario","Milan");
 3 Trader alan = new Trader("Alan","Cambridge");
 4 Trader brian = new Trader("Brian","Cambridge");
 5 List<Transaction> transactions = Arrays.asList(
 6 new Transaction(brian, 2011, 300),
 7 new Transaction(raoul, 2012, 1000),
 8 new Transaction(raoul, 2011, 400),
 9 new Transaction(mario, 2012, 710),
10 new Transaction(mario, 2012, 700),
11 new Transaction(alan, 2012, 950)
12 );

 

public class Trader{
private final String name;
private final String city;
public Trader(String n, String c){
this.name = n;
this.city = c;
}
public String getName(){
return this.name;
}
public String getCity(){
return this.city;
}
public String toString(){
return "Trader:"+this.name + " in " + this.city;
}
}

 

public class Transaction{
private final Trader trader;
private final int year;
private final int value;
public Transaction(Trader trader, int year, int value){
this.trader = trader;
this.year = year;
this.value = value;
}
public Trader getTrader(){
return this.trader;
}
public int getYear(){
return this.year;
}
public int getValue(){
return this.value;
}
public String toString(){
return "{" + this.trader + ", " +
"year: "+this.year+", " +
"value:" + this.value +"}";
}
}

 

//找出2011年的所有交易并按交易额排序(从低到高)
List<Transaction> tr2011 =
transactions.stream()
.filter(transaction -> transaction.getYear() == 2011)//给filter传递一个谓词来选择2011年的交易
.sorted(comparing(Transaction::getValue))//按照交易额进行排序
.collect(toList());//将生成的Stream中的所有元素收集到一个List中

 

//交易员都在哪些不同的城市工作过
List<String> cities =
transactions.stream()
.map(transaction -> transaction.getTrader().getCity())//提取与交易相关的每位交易员的所在城市
.distinct()//只选择互不相同的城市
.collect(toList());

 

//查找所有来自于剑桥的交易员,并按姓名排序
List<Trader> traders =
transactions.stream()
.map(Transaction::getTrader)//从交易中提取所有交易员
.filter(trader -> trader.getCity().equals("Cambridge"))//仅选择位于剑
桥的交易员
.distinct()//确保没有任何重复
.sorted(comparing(Trader::getName))//对生成的交易员流按照姓名进行排序
.collect(toList());

 

//返回所有交易员的姓名字符串,按字母顺序排序
String traderStr =
transactions.stream()
.map(transaction -> transaction.getTrader().getName())//提取所有交易员姓名,生成一个Strings构成的Stream
.distinct()//只选择不相同的姓名
.sorted()//对姓名按字母顺序排序
.reduce("", (n1, n2) -> n1 + n2);//逐个拼接每个名字,得到一个将所有名字连接起来的String

 

//有没有交易员是在米兰工作的
boolean milanBased =
transactions.stream()
.anyMatch(transaction -> transaction.getTrader()
.getCity()
.equals("Milan"));//把一个谓词传递给anyMatch,检查是否有交易员在米兰工作

 

//打印生活在剑桥的交易员的所有交易额
transactions.stream()
.filter(t -> "Cambridge".equals(t.getTrader().getCity()))//选择住在剑桥的交易员所进行的交易
.map(Transaction::getValue)//提取这些交易的交易额
.forEach(System.out::println);//打印每个值

 

//所有交易中,最高的交易额是多少
Optional<Integer> highestValue =
transactions.stream()
.map(Transaction::getValue)//提取每项交易的交易额
.reduce(Integer::max);//计算生成的流中的最大值

 

//找到交易额最小的交易
Optional<Transaction> smallestTransaction =
transactions.stream()
.reduce((t1, t2) ->t1.getValue() < t2.getValue() ? t1 : t2);//通过反复比较每个交易的交易额,找出最小的交易

Optional<Transaction> smallestTransaction =
transactions.stream()
.min(comparing(Transaction::getValue));//流支持min和max方法,它们可以接受一个Comparator作为参数,指定计算最小或最大值时要比较哪个键值

 

posted @ 2018-01-15 17:14  薄焦尾  阅读(194)  评论(0编辑  收藏  举报