JUC并发编程_四大函数式接口和 Stream 流式计算
JUC并发编程_四大函数式接口和 Stream 流式计算
- 四大函数式接口
- Function 接口
- Predicate 接口
- Consumer 接口
- Supplier 接口
- Stream 流式计算
- Stream 的中间操作
- filter:过滤流中的元素,只保留满足条件的元素
- map:对流中的每个元素应用一个函数,并将结果收集到一个新的流中
- sorted:对流中的元素进行排序
- distinct:去除流中的重复元素
- limit:获取流中的前N个元素
- skip:跳过流中的前N个元素
- Stream 的终端操作
- forEach:对流中的每个元素执行一个操作
- collect:将流中的元素收集到一个List、Set或Map中
- count:统计流中的元素数量
- min/max:查找流中的最小或最大元素
- reduce:通过某种计算将流中的所有元素组合起来,得到一个值
四大函数式接口
Function 接口
接受一个输入参数并返回结果。主要用于转换数据,比如字符串转大写、数字加一等。
方法:R apply(T t)
Function<String, String> function = (String str) -> {if (StrUtils.isNotEmpty(str)) {return str;} else {return "";}
};
System.out.println(function.apply("blu"));
Predicate 接口
方法:boolean test(Object o)
接受单个输入参数并返回布尔值结果。主要用于条件判断,比如检查字符串是否为空、数字是否大于某个值等。
Predicate predicate = (Predicate<String>) str -> StrUtils.isEmpty(str);
System.out.println(predicate.test("blu"));
Consumer 接口
方法:void accept(T t)
接受单个输入参数但不返回任何结果,主要用于执行某些操作,比如打印日志、发送数据等。
Consumer<String> consumer = str -> System.out.println(str);
consumer.accept("blu");
Supplier 接口
方法:T get()
不接受任何参数但返回某种类型结果,主要用于提供数据,比如生成随机数、获取当前时间等。
Supplier<Integer> supplier = () -> {Random random = new Random();//生成0-100的随机整数return random.nextInt(101);
};
System.out.println(supplier.get());
Stream 流式计算
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("4");
list.add("");
list.stream().filter(s -> {return !s.isEmpty();}).filter(s -> {return Integer.parseInt(s) > 2;}).map(s -> {return Integer.parseInt(s);}).sorted(Comparator.reverseOrder()).distinct().limit(1).forEach(i -> {System.out.println(i * 100);});
Stream 的中间操作
filter:过滤流中的元素,只保留满足条件的元素
Stream<T> filter(Predicate<? super T> predicate);
map:对流中的每个元素应用一个函数,并将结果收集到一个新的流中
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
sorted:对流中的元素进行排序
Stream<T> sorted(Comparator<? super T> comparator);
distinct:去除流中的重复元素
Stream<T> distinct();
limit:获取流中的前N个元素
Stream<T> limit(long maxSize);
skip:跳过流中的前N个元素
Stream<T> skip(long n);
Stream 的终端操作
forEach:对流中的每个元素执行一个操作
stream.forEach(i -> {//do Something
});
collect:将流中的元素收集到一个List、Set或Map中
stream.collect(Collectors.toList());
count:统计流中的元素数量
long count = stream.count();
min/max:查找流中的最小或最大元素
stream.min(Comparator.comparing(i -> {return i;
}));
reduce:通过某种计算将流中的所有元素组合起来,得到一个值
求和
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream().reduce(0, Integer::sum);
字符串拼接
List<String> strs = Arrays.asList("B", "L", "U");
String all = strs.stream().reduce("Hello ", (s, s2) -> s + s2);