以java 8方式添加postfix

时间:2015-01-31 12:09:04

标签: java java-8

我需要一个返回包含{XXX11, XXX12, XXX13, XXX14, XXX21, ... , XXX43, XXX44}的集合的函数,其中XXX是函数的整数参数。什么是 Java 8 风格的优雅方式?我在前缀的情况下做了一个数字如下:

/**
 * I need to get {<base>11, <base>12, ..., <base>44} but can't...
 * @return {<base>1, <base>2, <base>3, <base>4}
 */
Set<Integer> addOnlyOnePrefix(int base){
  return IntStream.range(1, 4).map(prefix -> base*10 + prefix)
      .boxed().collect(Collectors.toSet());
}

3 个答案:

答案 0 :(得分:5)

最简单的方法可能是生成16个值:

Set<Integer> addOnlyTwoPrefixes(int base) {
  return IntStream.range(0, 16)
      .map(prefix ->
          base * 100 +             // Leading digits
          10 + 10 * (prefix / 4) + // Penultimate digit
          1 + (prefix % 4))        // Last digit
      .boxed()
      .collect(Collectors.toSet());
}

10+和1+将考虑prefix / 4prefix % 4在0-3而不是1-4范围内。

答案 1 :(得分:3)

你可以flatMap

首先生成IntStream 1..4并将其乘以10.然后flatMap另一IntStream 1..411,12..21,22..

base乘以100并将其添加到IntStream

Set<Integer> addTwoPrefixes(final int base) {
    final int prefix = base * 100;
    return IntStream
            .rangeClosed(1, 4).map(i -> i * 10)
            .flatMap(i -> IntStream.rangeClosed(1, 4).map(j -> i + j))
            .map(i -> base + i)
            .boxed()
            .collect(toCollection(LinkedHashSet::new));
}

请注意,我已收集到LinkedHashSet以保留订单。

答案 2 :(得分:2)

您可以使用递归来编写添加n个前缀的方法:

static IntStream addNPrefixes(int base, int n) {
    return n == 0 ? IntStream.of(base) : addNPrefixes(base, n - 1)
            .flatMap(b -> IntStream.rangeClosed(1, 4).map(prefix -> b * 10 + prefix));
}

然后你想要的方法如下:

static Set<Integer> addTwoPrefixesThenCollectToSet(int base) {
    return addNPrefixes(base, 2).boxed().collect(Collectors.toSet());
}

如果你想要,你可以很容易地改变第一种允许传入前缀生成功能的方法:

static IntStream addNPrefixes(int base, int n, Supplier<IntStream> prefixes) {
    return n == 0 ? IntStream.of(base) : addNPrefixes(base, n - 1, prefixes)
            .flatMap(b -> prefixes.get().map(prefix -> b * 10 + prefix));
}