如何在Stream.map方法中传递参数

时间:2017-04-07 11:04:06

标签: java collections java-8 java-stream

以下陈述的含义是什么:

String joined = elements.stream()
  .map(Object::toString)
  .collect(Collectors.joining(", "));

据我了解,Stream.map接受Function类型的参数。 我不明白Object::toString是如何传递的以及它是如何工作的?

感谢。

2 个答案:

答案 0 :(得分:1)

  

如何传递Object::toString及其工作原理?

它被称为方法参考,您要告诉使用现有的toString方法定义(来自Object类)map方法,而不是在obj -> obj.toString()方法中明确调用map

我建议您查看here并了解方法引用在Java8中的工作原理。

答案 1 :(得分:0)

如何将方法引用或函数传递给我自己的方法?

在某些情况下,我需要做同样的事情。

     private String getStringValuesFromList(List<Integer> myClassIds) {
        List<MyClass> myObjects = myClassService.find(myClassIds);
        if (CollectionUtils.isNotEmpty(myObjects)) {
            return myObjects
                    .stream()
                    .map(MyClass::getName)
                    .sorted()
                    .collect(Collectors.joining(", "));
        }
        return StringUtils.EMPTY;
    }

    private String getOtherClassStringFromIds(List<Integer> myOtherClassIds) {
        List<MyOtherClass> myOtherClasses= myOtherClassService.find(myOtherClassIds);
        if (CollectionUtils.isNotEmpty(myOtherClasses)) {
            return myOtherClassIds
                    .stream()
                    .map(p  -> new String(p.getLazyLoadedRelation.getName() + " - " + p.getName()))
                    .sorted()
                    .collect(Collectors.joining(", "));
        }
        return StringUtils.EMPTY;
    }

    private String getMyOtherClassNamesStringFromStrings(List<String> myOtherClassNamesList) {
        if (CollectionUtils.isNotEmpty(myOtherClassNamesList)) {

            return myOtherClassNamesList
                    .stream()
                    .sorted()
                    .collect(Collectors.joining(", "));
        }
        return StringUtils.EMPTY;
    }

是否可以创建一个方法来获取要传递给地图的参数,这样我就可以创建一个方法来处理流并调用3次。

额外的好处是,如果我将null传递给该方法,则跳过.map()部分

例如(这不会编译,但是希望您能理解我要去的地方。

private String concatenateValues(List<Object> objectList,  Function<String, String> mapperValue) {
        if (CollectionUtils.isNotEmpty(objectList)) {
            return objectList.stream()
                    .map(mapperValue)
                    .sorted()
                    .collect(Collectors.joining(", ");
        }
        return StringUtils.EMPTY;
    }