是否可以使用Java Guava将joiner(collector,accumulator)应用于函数?

时间:2016-06-02 10:06:38

标签: java collections guava java-stream joiner

分组时是否可以收集字符串?这就是它在Java 8中的工作原理:

int64_t delayInSeconds = 0.2;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

        float registerOne = [[NSUserDefaults standardUserDefaults]     floatForKey:@"POP01"];
        SinP.value = registerOne;
        UIImageView *handleView1 = [SinP.subviews lastObject];
        UILabel *label = [[UILabel alloc] init];
        label = (UILabel*)[handleView1 viewWithTag:1001];
        label = [[UILabel alloc] initWithFrame:handleView1.bounds];
        label.tag = 1001;
        label.backgroundColor = [UIColor clearColor];
        label.textColor = [UIColor whiteColor];
        label.textAlignment = NSTextAlignmentCenter;
        handleView1.backgroundColor= [UIColor clearColor];
        [handleView1 addSubview:label];
        label.text = [NSString stringWithFormat:@"%0.0f",       self.SinP.value];

      });

我很好奇,有没有简洁的方法在Google Guava中做到这一点?这就是我如何尝试在Guava中复制它:

Map<String, String> discountOptions = p.getDiscountOptions().Stream()
    .collect(groupingBy(
        this::getDiscountName,
        Collectors.mapping(this::getValue, Collectors.joining(","))));

1 个答案:

答案 0 :(得分:3)

你不会比Java 8流API更简洁,因为它存在的原因是为了改善这些操作。

Pre-Java 8函数式编程可以通过Guava的功能实用程序进行评判,但是This article has help me understand the selectors a little more.

  

从Java 7开始,Java中的函数式编程只能通过匿名类的笨拙和冗长的使用来近似.... 过度使用Guava的函数式编程习语会导致冗长,混乱,难以理解和低效的代码....从Java 7开始,命令式代码应该是您的默认首选

以下是您的代码的必要翻译:

private static final Joiner COMMA_JOINER = Joiner.on(",");

ListMultimap<String, String> groupedByDiscountName = ArrayListMultimap.create();
for (DiscountOption option : p.getDiscountOptions()) {
  groupedByDiscountName.put(getDiscountName(option), getValue(option));
}

ImmutableMap.Builder<String, String> builder = ImmutableMap.builder();
for (Entry<String, Collection<String>> e : groupedByDiscountName.asMap().entrySet()) {
  builder.put(e.getKey(), COMMA_JOINER.join(e.getValues());
}
Map<String, String> discountOptions = builder.build();

它更短更容易阅读。鉴于您当前的API,这几乎是您使用Java 7的最佳方式。

那就是说你可能会考虑重新检查你的API - 特别是你使用静态方法(getDiscountName()getValue())从你的DiscountOption类中提取数据是奇怪的 - 这些似乎是实例方法的明确候选者。同样,您可以考虑创建一个包含一个或多个Discounts实例的DiscountOption类,并提供一个返回逗号分隔字符串的toString()。然后你只需构建你的Discounts对象就可以了。