分组时是否可以收集字符串?这就是它在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(","))));
答案 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
对象就可以了。