Java8 Stream实战(一)

参考自《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))
/// 从高到低
//.sorted(Comparator.comparing(Transaction::getValue).reversed())
.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()
/// 返回一个List
//.collect(Collectors.toList());
.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的筛选和切片、映射、查找和匹配、规约、以及各类收集器(我们甚至可以自定义收集器)。后续我会陆续更新,敬请期待。。。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×