ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-guava-Iterables避免重复多次

2019-10-28 20:03:37  阅读:191  来源: 互联网

标签:guava java functional-programming


我有一个包含两个字符串属性的对象列表.

public class A {
    public String a;
    public String b;
}

我想检索两个包含属性a和一个b的集合.

这些方法的天真之处在于:

List<A> list = ....
Set<String> listofa = new HashSet<>();
Set<String> listofb = new HashSet<>();
for (A item : list) {
    if (item.a != null) 
        listofa.add(item.a);
    if (item.b != null) 
        listofb.add(item.b);

}

试图以一种功能性的方式在番石榴中完成,我最终得到了这种方法:

Function<String,A> getAFromList = new Function<>() {
    @Nullable
    @Override
    public String apply(@Nullable A input) {
        return input.a;
    }
};

Function<String,A> getBFromList = Function<>() {
    @Nullable
    @Override
    public String apply(@Nullable A input) {
        return input.b;
    }
};

FluentIterable<A> iterables = FluentIterable.from(list);

Set<String> listofAs = ImmutableSet.copyOf(iterables.transform(getAFromList).filter(Predicates.notNull()));

Set<String> listofBs = ImmutableSet.copyOf(iterables.transform(getBFromList).filter(Predicates.notNull()));

但是,这样一来,我将在列表上进行两次迭代.

有什么方法可以避免重复两次或多次?

总的来说,如何以一种实用的方式解决这些用例(不仅在guava / java中)?

解决方法:

首先,您要进行优化-但是,如果性能至关重要,请在番石榴上使用常规的Java方法(即您的第一种方法).参见here.

我想因为您想要两个结果,所以在某个时候您将需要迭代两次(除非您传入要填充的集合之一,但这绝对不是fp方法,因为它不是纯函数).

但是,如果迭代的成本足以需要优化,则可以将其迭代一次到中间结构:

a_b_pairs = transformToJustAB(input) //single expensive iteration
list_of_a = transformA(a_b_pairs) //multiple cheaper iterations
list_of_b = transformB(a_b_pairs)

标签:guava,java,functional-programming
来源: https://codeday.me/bug/20191028/1954643.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有