【问题标题】:Difference between map and filter on a java collection streamjava集合流上的map和filter之间的区别
【发布时间】:2016-05-11 06:12:50
【问题描述】:

假设有一个列表说

List<String> myList = new ArrayList<String>();
myList.add("okay");
myList.add("omg");
myList.add("kk");

我正在这样做:

List<String> fianllist = myStream.map(item -> item.toUpperCase()).filter(item
->item.startsWith("O")).collect(Collectors.toList());

我的问题是 map 和 filter 之间的区别是什么,因为两者都可以将 lambda 表达式作为参数。有人可以解释一下吗?

【问题讨论】:

  • 您阅读过 Javadoc 吗?他们做的事情完全不同。
  • map 将传递的流元素(字符串)映射到其他东西,这里是另一个字符串值,但它也可能是一个整数。 filter 删除不符合条件的元素。
  • 将其视为数据库查询。从 name="John"(过滤器)的用户中选择名称(地图)。
  • 感谢您的澄清

标签: java collections java-stream


【解决方案1】:

通过使用 ma​​p,您可以转换对象值。

map 操作允许我们应用一个函数,该函数接受一种类型的参数,并返回其他值。

Filter用于过滤数据,它总是返回布尔值。 如果返回 true,则将该项目添加到列表中,否则将其过滤掉(忽略) 例如:

List<Person> persons = …
Stream<Person> personsOver18 = persons.stream().filter(p -> p.getAge() > 18);

有关此主题的更多详细信息,您可以访问link

【讨论】:

    【解决方案2】:

    ma​​p 返回一个流,其中包含将给定函数应用于该流的元素的结果。简单一句话,map返回变换后的object值。

    例如,使用 map() 将给定的字符串从小写转换为大写。

    myList.stream().map(s -&gt; s.toUpperCase()).forEach(System.out::println);

    filter 返回一个由该流中与给定谓词匹配的元素组成的流。简单来说,过滤器返回满足谓词的元素流。

    例如,使用过滤器查找以'o'开头的字符串。

    myList.stream().filter(s -&gt; s.startsWith("o")).forEach(System.out::println);

    计划:

    import java.util.ArrayList;
    import java.util.List;
    
    public class MapAndFilterExample {
        static List<String> myList = null;
    
        static {
            myList = new ArrayList<String>();
            myList.add("okay");
            myList.add("omg");
            myList.add("kk");
        }
    
        public static void main(String[] args) {
            System.out.println("Converting the given Strings from Lower case to Upper case by using map");
            myList.stream().map(s -> s.toUpperCase()).forEach(System.out::println);
        
            System.out.println("filter which is starting with 'o' by using filter");
            myList.stream().filter(s -> s.startsWith("o")).forEach(System.out::println);
        }
    }
    

    【讨论】:

      【解决方案3】:

      过滤器将谓词作为参数,因此基本上您是在根据条件验证输入/集合,而映射允许您在流上定义或使用现有函数,例如您可以应用 String.toUpperCase(...) 等并转换您的inputlist 相应地。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-25
        • 2015-10-24
        • 2012-03-24
        • 2017-05-28
        • 1970-01-01
        • 2019-11-14
        • 1970-01-01
        • 2016-03-29
        相关资源
        最近更新 更多