ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java Stream 流式编程实战演练

2021-08-20 18:32:30  阅读:192  来源: 互联网

标签:Java name Stream gender 流式 Student Gender public String


Java 8 新引入的流式编程 (Stream) 功能很强大,用的好可以大大简化代码,提高效率。同时,大数据编程框架的源码以及业务代码大量使用了流式编程的思想。所以,这一块必须熟练掌握。

但是,流式编程不是 "the silver bullet" ,有些场景使用可能 overkill ,让代码不那么易读,而且打 log 或者 debug 的时候费劲。下面就举 2 例。

例1

业务逻辑:写一个函数,判断 Student 的性别是男生还是女生。

  • 实现1:是比较老派的写法,中规中矩。
  • 实现2:是流式编程的写法。使用了 Optional + map + filter

废话不多说,上代码:

实体类

public class Student {
    private String name;
    private Gender gender;

    public Student(String name, Gender gender) {
        this.name = name;
        this.gender = gender;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Gender getGender() {
        return gender;
    }
    public void setGender(Gender gender) {
        this.gender = gender;
    }
}

enum Gender {
    Boy, Girl
}

实现1

public static boolean isBoy(Student student) {
	if (student == null || student.getGender() == null) return false;

	if (student.getGender() == Gender.Boy){
		return true;
	} else {
		return false;
	}
}

实现2

public static boolean isGirl(Student student) {
	return Optional.ofNullable(student)
			.map(Student::getGender)
			.filter(gender -> gender == Gender.Girl).isPresent();
}

主函数

public static void main(String[] args) {

	Student s1 = new Student("Alice", Gender.Girl);
	Student s2 = new Student("Bob", Gender.Boy);

	System.out.println(s1.getName() + " is a girl: " + isGirl(s1));
	System.out.println(s2.getName() + " is a boy: " + isBoy(s2));

}

输出

Alice is a girl: true
Bob is a boy: true

个人认为,这里使用流式编程有一点点 overkill ,因为老派的实现方法已经足够简洁。

例2

业务逻辑:有一个 list ,里面放了一堆 map ,而 map 里面放的是键值对:【姓名-成绩】。要求,把所有学生的名字收集起来,做成一个字符串输出。

  • 实现1:使用 for 循环的常规写法。
  • 实现2:使用了 flatmap + collect
public static void main(String[] args) {

	// prep data
	List<Map<String, String>> scoreList = new ArrayList<>();
	Map<String, String> scoreGroup1 = new HashMap();
	scoreGroup1.put("Alice", "70");
	scoreGroup1.put("Bob", "90");
	Map<String, String> scoreGroup2 = new HashMap();
	scoreGroup2.put("Charles", "80");
	scoreList.add(scoreGroup1);
	scoreList.add(scoreGroup2);

	// process 1
	StringBuilder names1 = new StringBuilder();
	for (Map<String, String> map: scoreList) {
		Set<String> set = map.keySet();
		for(String key: set) {
			if (!names1.toString().isEmpty()){
				names1.append(", " + key);
			} else {
				names1.append(key);
			}
		}
	}
	System.out.println("Process 1 - Student names: " + names1.toString());

	// process 2
	String names2 = scoreList
			.stream()
			.flatMap(e -> e.keySet().stream())
			.collect(Collectors.joining(", "));
	System.out.println("Process 2 - Student names: " + names2);
}

输出

Process 1 - Student names: Bob, Alice, Charles
Process 2 - Student names: Bob, Alice, Charles

这个例子中,使用 flatpmap 还是大大简化了代码的。

总结

从个人角度出发,打铁还需自身硬。有些流式编程的代码一开始看确实晦涩难懂,那我们就平时多用 Stream 练练手,写的多了,自然就熟了。

  • 如果是一个 legacy 的项目,就尽量跟原来的 coding style 保持一致,这样减少 bug 率。
  • 如果是一个新的或者大数据的项目,那就多用流式编程。

参考

标签:Java,name,Stream,gender,流式,Student,Gender,public,String
来源: https://www.cnblogs.com/maxstack/p/15167407.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有