特点
- 代码简洁:函数式编程写出的代码简洁且意图明确,使用stream接口让你从此告别for循环。
- 多核友好: Java函数式编程使得编写并行程序从未如此简单,你需要的全部就是调用一下方法。
流程
- 第一步:把集合转换为流stream
- 第二步:操作stream流,stream流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果
操作符
中间操作符
流方法 | 作用 |
---|---|
filter | 用于通过设置的条件过滤出元素 |
distinct | 返回一个去重(根据元素的hashCode和equals方法判断)后的流 |
limit | 会返回一个不超过定长的流 |
skip | 返回一个删除了前n个元素的流 |
map | 接受一个函数作为参数,应用到每一个元素,并映射成一个新的元素 |
sorted | 对流排序 |
public class StreamTest {
public static void main(String[] args) {
List<String> stringList = Arrays.asList("abc", "fds", "hli", "hli");
/**
* @Description:filter(表达式条件):过滤掉不符合条件的集合元素,第一个str是参数(代表集合元素,方便遍历),第二是该参数的过滤逻辑
*/
List<String> result = stringList.stream().filter(str -> str.contains("f"))
.collect(Collectors.toList());
System.out.println(result);
/**
* @Description:distinct():元素去重,如果是引用类型,要重写equals方法和hashCode方法,String已经帮我们重写了这两个方法
*/
List<String> result1 = stringList.stream().distinct()
.collect(Collectors.toList());
System.out.println("去重:" + result1);
List<User> userList = new ArrayList<>();
userList.add(new User("pang"));
userList.add(new User("pang"));
List<User> userList1 = userList.stream().distinct()
.collect(Collectors.toList());
System.out.println("对象去重" + userList1);
/**
* @Description:limit(long maxSize):限制个数,只获取前面maxSize个元素
*/
List<String> result3 = stringList.stream().limit(2)
.collect(Collectors.toList());
System.out.println(result3);// 只输出了两个元素
/**
* @Description:skip(long n):获取除前n个元素的其他元素
*/
List<String> skipList = stringList.stream().skip(2)
.collect(Collectors.toList());
System.out.println(skipList);
/**
* @Description:map(表达式条件):对流中的所有元素做统一处理
*/
List<String> mapList = stringList.stream().map(str -> str.concat("_ROLE"))
.collect(Collectors.toList());
System.out.println(mapList);
/**
* @Description:sorted(比较器):对流排序
*/
List<String> list = Arrays.asList("你好", "世界", "就是");
List<String> sortList = list.stream().sorted(Collections.reverseOrder(Collator.getInstance(Locale.CHINA)))
.collect(Collectors.toList());
System.out.println(sortList);
}
}
终止操作符
流方法 | 作用 |
---|---|
forEach | 循环集合元素,没有返回值,不改变原来的集合元素 |
collect | 将流转化为其他形式 |
/**
* @Description:循环,没有返回值,不改变原来的集合元素
*/
stringList.stream().forEach(s -> System.out.println(s.concat("_ADMIN")));
System.out.println(stringList);
/**
* @Description:collect 将流转换成为其他形式:
* Collectors.toMap(k -> k, v -> v, (oldValue, newValue) -> newValue)
* v -> v(第一个参数确定key),v -> "" (第二个参数确定value),后面指定key重复后的选择性,覆盖原来旧的
*/
Map<String, String> map = stringList.stream().collect(Collectors.toMap(v -> v, v -> "nihao", (oldValue, newValue) -> newValue));
System.out.println(map);