首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >:如何使用方法引用?

:如何使用方法引用?
EN

Stack Overflow用户
提问于 2019-08-30 09:39:16
回答 2查看 129关注 0票数 0

有密码

代码语言:javascript
复制
     class Person {
        private ZonedDateTime date ;
        private int regionId;
        private int centerId;
        private int amount1;
        private float percent1;
}

 List<Person> entityList = new ArrayList<>();

我按月份的年数分组如下:

代码语言:javascript
复制
  listPerson.stream()
            .collect(Collectors.groupingBy(i -> i.getDate().getMonth(),Collectors.collectingAndThen(Collectors.toList(),
            l -> {
                   Integer sumAmount1 = l.stream().collect(Collectors.summingInt(i -> i.getAmount1()));                                                 
                   Double avgPerc1 = l.stream().collect(Collectors.averagingDouble(i -> i.getPercent1()));                                                   
                   List<String> data = new ArrayList<>();
                   data.add(Integer.toString(sumAmount1));
                   data.add(Double.toString(avgPerc1));                                                   
                   return data;
                }
            ))).forEach((k,v) -> System.out.println(k.getValue() + "-" + v.toString()));

我还以同样的方式按年、regionId、centerId分组:

代码语言:javascript
复制
 listPerson.stream()
                .collect(Collectors.groupingBy(i -> i.getDate().getYear(),Collectors ......

但是我有很多重复的代码

代码语言:javascript
复制
l -> {...} 

重复了很多次。如何代替l -> {.}使用方法引用?

EN

回答 2

Stack Overflow用户

发布于 2019-08-30 09:47:13

您可以创建如下方法引用:

代码语言:javascript
复制
private List<String> methodReference(List<Person> l) {
    Integer sumAmount1 = l.stream().collect(Collectors.summingInt(i -> i.getAmount1()));
    Double avgPerc1 = l.stream().collect(Collectors.averagingDouble(i -> i.getPercent1()));
    List<String> data = new ArrayList<>();
    data.add(Integer.toString(sumAmount1));
    data.add(Double.toString(avgPerc1));
    return data;
}

我在我的methodReference类中创建了一个Test。您可以用自己的类名替换它。现在在您的stream()中,您可以这样引用它:

代码语言:javascript
复制
entityList.stream()
        .collect(Collectors.groupingBy(i -> i.getDate().getMonth(), Collectors.collectingAndThen(Collectors.toList(),
                Test::methodReference // replace Test with your class name
        ))).forEach((k, v) -> System.out.println(k.getValue() + "-" + v.toString()));
票数 1
EN

Stack Overflow用户

发布于 2019-09-04 10:52:08

可能有点主题,但我认为使用Stream的好处是允许您构建数据管道。我会努力构建一个看起来像管道的东西,我可以用可插拔的函数定制一些步骤。

我认为,通过向管道重构代码,代码将更加可读性,下面我将尝试使用一个名为Tuple2的新数据结构,即它的map方法。它很容易构建,您也可以使用像vavr这样的库。

为了重用,人们可以考虑像groupAndSummarize这样的函数(名称表明它做了两件事,气味也是如此)。

代码语言:javascript
复制
class Tuple2<T1, T2> {
    private final T1 t1;
    private final T2 t2;

    public Tuple2(final T1 t1, final T2 t2) {
        this.t1 = t1;
        this.t2 = t2;
    }

    public <U1, U2> Tuple2<U1, U2> map(final Function<T1, U1> func1,
                                       final Function<T2, U2> func2) {
        return new Tuple2<>(func1.apply(t1), func2.apply(t2));
    }

    public T1 _1() { return t1; }
    public T2 _2() { return t2; }
}

private <T, K, V> List<Tuple2<K, V>> groupAndSummarize(final List<T> list, final Function<T, K> groupFn, final Function<List<T>, V> summarizeFn) {
    return list.stream()
            .collect(Collectors.groupingBy(groupFn))
            .entrySet()
            .stream()
            .map(this::toTuple)
            .map(t -> t.map(
                    Function.identity(),
                    summarizeFn
            ))
            .collect(Collectors.toList());
}

private <K, V> Tuple2<K, V> toTuple(final Map.Entry<K, V> entry) {
    return new Tuple2<>(entry.getKey(), entry.getValue());
}

private List<String> summarize(final List<Person> l) {
    // your logic
}

public void test() {
    final List<Person> entityList = new ArrayList<>();

    groupAndSummarize(entityList, i -> i.getDate().getMonth(), this::summarize)
            .forEach(t -> System.out.println(t.t1.getValue() + "-" + t.t2.toString()));
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57724241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档