如何使用流计算列表的总和?

时间:2018-07-22 09:14:09

标签: java

我有一个像 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. guard let gai = GAI.sharedInstance() else { assert(false, "Google Analytics not configured correctly") } gai.tracker(withTrackingId: "UA-1226695665345-1") // Optional: automatically report uncaught exceptions. gai.trackUncaughtExceptions = true GAI.sharedInstance().dryRun = true gai.defaultTracker.allowIDFACollection = true // Optional: set Logger to VERBOSE for debug information. // Remove before app release. gai.logger.logLevel = .verbose; guard let tracker = GAI.sharedInstance().defaultTracker else { assert(false, "Google Analytics not configured correctly") } tracker.set(kGAIScreenName, value: "ViewController") tracker.allowIDFACollection = true guard let builder = GAIDictionaryBuilder.createScreenView() else { assert(false, "Google Analytics not configured correctly") } tracker.send(builder.build() as [NSObject : AnyObject]) } 这样的List<Integer>,我想得到像{ 1, 2, 3 ,4, 5 }这样的结果。

如何使用Java8流以任何聪明的方式做到这一点?

12345由一位数字非负整数组成。

我绝对可以喜欢List,但这很繁琐。

5 个答案:

答案 0 :(得分:5)

使用IntStream.reduce

int n = IntStream.of(array).reduce(0, (a,b) -> 10*a + b)

这实际上与以下内容相同:

int n = 0;
for (int b : array) {
  n = 10 * n + b;
}

就个人而言,我会在没有其他约束的情况下选择后者,因为它是简单得多的代码,不涉及重量相对较大的流框架,更易于调试等。

答案 1 :(得分:1)

这是通过不使用流,而是使用正则表达式 可能 的方式:

Integer.parseInt(Arrays.toString(nums).replaceAll("\\D+", ""));

答案 2 :(得分:1)

您还可以使用以下方法获得相同的结果

List<Integer> ints = Arrays.asList(1, 2, 3, 4, 5);
int size = ints.size();
double res = IntStream.range(1, size + 1)
        .mapToDouble(i -> ints.get(i - 1) * Math.pow(10, size - i))
        .sum();

那只是将每个digit*(10^digit_position_from_right)的和加起来,其中digit_position_from_right从零开始。

答案 3 :(得分:0)

最实用的想法之一可能是将数字视为字符串,然后在末尾解析它们:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Long result = list.stream()
  .map(Object::toString)
  .collect(Collectors.collectingAndThen(
    Collectors.joining(), Long::parseLong));

答案 4 :(得分:0)

可以使用以下方法获得结果:

List<Integer> nums = Arrays.asList(1, 2,3,4);
String s = "";
for (Integer x : nums) {
     s += x.toString();
}
Integer FinalNum = Integer.parseInt(s);