当前位置: 首页 > news >正文

.耐思尼克官方网站北京市网页设计

.耐思尼克官方网站,北京市网页设计,网站外链隐形框架是什么,网页制作的基础知识我们来深入剖析 Stream API 中最核心、最常用的“三巨头”:filter、map 和 collect。理解了它们,你就掌握了 Stream 大半的精髓。1. filter() - 过滤器 是什么? filter 是一个中间操作。它就像一个大筛子或一个过滤器,用于从流中筛…

我们来深入剖析 Stream API 中最核心、最常用的“三巨头”:filtermapcollect。理解了它们,你就掌握了 Stream 大半的精髓。


1. filter() - 过滤器

是什么?

filter 是一个中间操作。它就像一个大筛子或一个过滤器,用于从流中筛选出满足特定条件的元素

怎么工作?
  • 参数:它接受一个 Predicate<? super T> 函数式接口作为参数。
    • Predicate 是一个“断言函数”,它接收一个参数,返回一个 boolean 值(truefalse)。
  • 逻辑:流中的每一个元素都会被传递给 Predicatetest 方法。
    • 如果 test 方法返回 true,该元素会被保留并传递到下一个操作。
    • 如果返回 false,该元素会被过滤掉。
  • 返回值:返回一个新的 Stream<T>,包含所有被保留的元素。
代码示例
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Anna", "Edward");// 过滤出所有以字母 "A" 开头的名字
List<String> namesStartingWithA = names.stream().filter(name -> name.startsWith("A")) // Predicate: 输入name,返回boolean.collect(Collectors.toList());System.out.println(namesStartingWithA); // 输出: [Alice, Anna]// 过滤出长度大于 3 的名字
List<String> longNames = names.stream().filter(name -> name.length() > 3).collect(Collectors.toList());System.out.println(longNames); // 输出: [Alice, Charlie, David, Anna, Edward]

2. map() - 映射/转换器

是什么?

map 是一个中间操作。它就像一个加工机床,用于将流中的每个元素转换成另一个形式。它是一对一的映射,原元素会被新元素替换。

怎么工作?
  • 参数:它接受一个 Function<? super T, ? extends R> 函数式接口作为参数。
    • Function 是一个“转换函数”,它接收一个参数(类型 T),返回一个结果(类型 R)。
  • 逻辑:流中的每一个元素都会被传递给 Functionapply 方法,并将该方法的返回值(可以是任何类型)组成一个新的流。
  • 返回值:返回一个 Stream<R>,流的元素类型可能已经从 T 改变为了 R
代码示例
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");// 1. 将每个字符串映射为它的长度(将 String 转换为 Integer)
List<Integer> nameLengths = names.stream().map(name -> name.length()) // Function: 输入String,返回Integer.collect(Collectors.toList());
System.out.println(nameLengths); // 输出: [5, 3, 7]// 2. 将每个字符串转换为大写
List<String> upperCaseNames = names.stream().map(String::toUpperCase) // 使用方法引用,等价于 .map(s -> s.toUpperCase()).collect(Collectors.toList());
System.out.println(upperCaseNames); // 输出: [ALICE, BOB, CHARLIE]// 更复杂的例子:从对象中提取特定字段
class Person {private String name;private int age;// 省略构造方法和getter/setter
}
List<Person> people = Arrays.asList(new Person("Alice", 25),new Person("Bob", 30)
);// 将 Person 流映射为 String 流(只包含名字)
List<String> onlyNames = people.stream().map(person -> person.getName()) // 输入Person,输出String.collect(Collectors.toList());
System.out.println(onlyNames); // 输出: [Alice, Bob]// 将 Person 流映射为 Integer 流(只包含年龄)
List<Integer> onlyAges = people.stream().map(Person::getAge) // 使用方法引用.collect(Collectors.toList());
System.out.println(onlyAges); // 输出: [25, 30]

3. collect() - 收集器/终结者

是什么?

collect 是一个终结操作。它是流水线的终点站,用于将流中的元素聚合、汇总到一个容器中(如 List, Set, Map)或生成一个值。它会触发整个流的实际执行。

怎么工作?
  • 参数:它接受一个 Collector<? super T, A, R> 接口的参数。
    • 幸运的是,我们很少自己实现这个接口,而是使用 Collectors 工具类提供的各种静态工厂方法。
  • 逻辑:它根据传入的 Collector 策略,对流中的元素进行可变缩减(mutable reduction),将元素累积到一个结果容器中。
  • 返回值:返回一个类型为 R 的结果,通常是一个集合或一个值。
常用 Collectors 方法示例
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Anna", "Bob");// 1. 收集到 List (最常用)
List<String> list = names.stream().filter(name -> name.length() > 3).collect(Collectors.toList()); // 返回 ArrayList// 2. 收集到 Set (自动去重)
Set<String> set = names.stream().collect(Collectors.toSet()); // 返回 HashSet, 输出: [Alice, Bob, Charlie, David, Anna] (只有一个Bob)// 3. 收集到指定的集合类型,例如 TreeSet
TreeSet<String> treeSet = names.stream().collect(Collectors.toCollection(TreeSet::new)); // 可以指定集合的具体实现// 4. 连接字符串:将所有元素用分隔符连接起来
String joined = names.stream().collect(Collectors.joining(", ")); // 参数是分隔符
System.out.println(joined); // 输出: Alice, Bob, Charlie, David, Anna, Bob// 5. 分组:按条件分组,返回一个 Map
// 按名字的首字母分组
Map<Character, List<String>> groupByFirstLetter = names.stream().collect(Collectors.groupingBy(name -> name.charAt(0)));
System.out.println(groupByFirstLetter);
// 输出: {A=[Alice, Anna], B=[Bob, Bob], C=[Charlie], D=[David]}// 6. 分区:是分组的一种特例,按true/false分区(满足条件和不满足条件的)
// 将名字分为长度大于3和不超过3的两部分
Map<Boolean, List<String>> partitioned = names.stream().collect(Collectors.partitioningBy(name -> name.length() > 3));
System.out.println(partitioned);
// 输出: {false=[Bob, Bob], true=[Alice, Charlie, David, Anna]}

组合使用:威力无穷

真正的威力在于将它们组合成一条声明式的流水线。

任务:有一个名字列表,要求:

  1. 过滤掉长度小于等于3的。
  2. 将所有名字转换为大写。
  3. 按字母顺序排序。
  4. 收集到一个新的 ArrayList 中。
List<String> names = Arrays.asList("Chris", "Alice", "Bob", "David", "Eve");List<String> processedNames = names.stream()         // 获取流.filter(name -> name.length() > 3)          // 1. 过滤.map(String::toUpperCase)                   // 2. 转换.sorted()                                   // 3. 排序.collect(Collectors.toList());              // 4. 收集System.out.println(processedNames); // 输出: [ALICE, CHRIS, DAVID]

总结对比

方法类型目的参数返回值
filter中间操作筛选元素Predicate<T> (返回boolean)Stream<T>
map中间操作转换元素Function<T, R> (T->R)Stream<R>
collect终结操作收集元素到容器Collector<? super T, A, R>R (通常是一个集合)

记住这个流程:获取流 -> 过滤(filter) -> 转换(map) -> 收集(collect)。这个模式可以解决你日常开发中绝大部分的数据处理需求。多练习,你就会越来越习惯这种声明式的优雅编程风格。

http://www.dtcms.com/a/562575.html

相关文章:

  • 长沙网站建设市场低价网站开发.net
  • 孤能子视角:EIS六线分析之“苏格拉底对话孔子及AI“
  • 【计算机软件资格考试】软考综合知识题高频考题及答案解析2
  • 免费做淘宝客网站攸县网站开发
  • 清润邯郸网站wordpress文章禁止搜索
  • 哈尔滨怎样快速建站oa手机端app下载
  • 网站备案用户名忘了怎么办网站优化可以做哪些优化
  • 品牌推广公司网站关键词优化软件效果
  • 蓬莱市住房和规划建设管理局网站网站代码seo优化
  • 中信建设有限责任公司官方网站成都成华网站建设
  • 郑州网站建设公司咨询做ppt的软件怎么下载网站
  • 有哪些做兼职的设计网站有哪些工作内容怎样做信息收费网站
  • 昆山网站建设哪里好哪个免费的网页制作软件最好
  • 网站外链优化方法成都网站建设案例单招网
  • 使用Python进行量化交易入门
  • 祈网网站建设wordpress 手机编辑器
  • ReSpec:突破RL训练瓶颈的推测解码优化系统
  • 微信网站制作北京上海app开发定制公司
  • wordpress 动漫网站app开发公司成都
  • 定制一个网站多少钱网上做网站任务
  • 临沂网站哪家好企业手机网站建设策划方案
  • 艾奇视觉网站建设设计app的软件
  • 重庆网站建设圣矢价格网app下载
  • python入门到编程第三章
  • 上海网站seo外包关于网站平台建设调研的函
  • 广州做网站的公司哪里租服务器做网站
  • 用ps做衣服网站首页react怎么做pc网站
  • 金融 网站 模板设计师做兼职的网站
  • 散列(hash)表
  • 做湲兔费网站视颍上海app软件开发