参考自《Java 8实战》
什么是stream 为什么使用Stream?因为它能让我们更高效地处理集合,让我们可以简洁地表达复杂的数据处理查询。此外,Stream可以透明地并行化。我们可以使用Stream API完成以下操作:
可以表达复杂的数据处理查询
可以使用filter、distinct、skip和limit对流做筛选和切片
可以使用map和flatmap提取或转换流中的元素
可以使用findFirst和findAny方法查找流中的元素
可以使用allMatch、noneMatch和anyMatch方法让流匹配给定的谓词
可以使用reduce方法将流中的所有元素 迭代合并成一个结果
除此之外我们应该知道,流不仅可以 从集合创建,也可以从值、数组、文件以及iterate与generate等特定的方法创建。
stream实践 准备工作 创建交易员实体类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 public class Trader { private String name; private String city; public Trader (String name, String city) { this .name = name; this .city = city; } public String getName () { return name; } public String getCity () { return city; } @Override public String toString () { return "Trader{" + "name='" + name + '\'' + ", city='" + city + '\'' + '}' ; } }
创建交易记录实体类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 public class Transaction { private Trader trader; private int year; private int value; public Transaction (Trader trader, int year, int value) { this .trader = trader; this .year = year; this .value = value; } public Trader getTrader () { return trader; } public void setTrader (Trader trader) { this .trader = trader; } public int getYear () { return year; } public void setYear (int year) { this .year = year; } public int getValue () { return value; } public void setValue (int value) { this .value = value; } @Override public String toString () { return "Transaction{" + "trader=" + trader + ", year=" + year + ", value=" + value + '}' ; } }
这里我增加了一个工具类,用于获取测试demo所需的集合:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class ListUtil { public static List<Transaction> getList () { Trader raoul = new Trader("Raoul" , "Cambridge" ); Trader mario = new Trader("Mario" , "Milan" ); Trader alan = new Trader("Alan" , "Cambridge" ); Trader brian = new Trader("Brian" , "Cambridge" ); return Arrays.asList( new Transaction(brian, 2011 , 300 ), new Transaction(raoul, 2012 , 1000 ), new Transaction(raoul, 2011 , 400 ), new Transaction(mario, 2012 , 710 ), new Transaction(mario, 2012 , 700 ), new Transaction(alan, 2012 , 950 ) ); } }
编码 1、找到2011年发生的所有交易,并按交易额排序(从低到高)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class Demo01 { public static void main (String[] args) { List<Transaction> collect = ListUtil.getList() .stream() .filter(n -> n.getYear() == 2011 ) .sorted(Comparator.comparing(Transaction::getValue)) .collect(Collectors.toList()); collect.forEach(System.out::println); } }
2、交易员都在哪些不同的城市工作过
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class Demo02 { public static void main (String[] args) { String collect = ListUtil.getList() .stream() .map(n -> n.getTrader().getCity()) .distinct() .collect(Collectors.joining(", " )); System.out.println(collect); } }
3、查找所有来自剑桥的交易员并按照姓名排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class Demo03 { public static void main (String[] args) { List<Trader> cambridge = ListUtil.getList() .stream() .map(Transaction::getTrader) .filter(trader -> "Cambridge" .equals(trader.getCity())) .distinct() .sorted(Comparator.comparing(Trader::getName)) .collect(Collectors.toList()); cambridge.forEach(System.out::println); } }
4、返回所有交易员的姓名字符串,按照字母顺序排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class Demo04 { public static void main (String[] args) { String collect = ListUtil.getList() .stream() .map(transaction -> transaction.getTrader().getName()) .distinct() .sorted(String::compareTo) .collect(Collectors.joining(", " )); System.out.println(collect); } }
5、有没有交易员是在米兰工作的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class Demo05 { public static void main (String[] args) { ListUtil.getList() .stream() .filter(transaction -> "Milan" .equals(transaction.getTrader().getCity())) .map(transaction -> transaction.getTrader().getName()) .distinct() .forEach(System.out::println); boolean b = ListUtil.getList() .stream() .anyMatch(transaction -> "Milan" .equals(transaction.getTrader().getCity())); System.out.println(b); } }
6、打印生活在剑桥的交易员的所有交易额
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public class Demo06 { public static void main (String[] args) { int sum = ListUtil.getList() .stream() .filter(transaction -> "Cambridge" .equals(transaction.getTrader().getCity())) .mapToInt(Transaction::getValue) .sum(); System.out.println("总交易额: " + sum); ListUtil.getList() .stream() .filter(transaction -> "Cambridge" .equals(transaction.getTrader().getCity())) .map(Transaction::getValue) .forEach(System.out::println); } }
7、所有的交易额中,最高的交易额是多少
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 public class Demo07 { public static void main (String[] args) { ListUtil.getList() .stream() .sorted(Comparator.comparing(Transaction::getValue).reversed()) .mapToInt(Transaction::getValue) .limit(1 ) .forEach(System.out::println); OptionalInt reduce = ListUtil.getList() .stream() .mapToInt(Transaction::getValue) .reduce(Integer::max); if (reduce.isPresent()) { System.out.println(reduce.getAsInt()); } ListUtil.getList() .stream() .mapToInt(Transaction::getValue) .reduce(Integer::max) .ifPresent(System.out::println); } }
8、找到交易额中最小的交易额
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class Demo08 { public static void main (String[] args) { ListUtil.getList() .stream() .sorted(Comparator.comparing(Transaction::getValue)) .mapToInt(Transaction::getValue) .limit(1 ) .forEach(System.out::println); ListUtil.getList() .stream() .map(Transaction::getValue) .reduce(Integer::min) .ifPresent(System.out::println); } }
至此,关于stream的8个demo介绍完毕,这只是简单的介绍用法,关于stream还有很多东西值得我们去探索,像stream的筛选和切片、映射、查找和匹配、规约、以及各类收集器(我们甚至可以自定义收集器)。后续我会陆续更新,敬请期待。。。