将数字总和计算为一行,输入有 3 位数字

Calculate digit sum as a one liner, input has 3 digits

我必须在一行中计算字符串的数字总和(通过扫描仪读取)。另外,我必须确保仅在输入正好有 3 位数字时才计算输入。

到目前为止我得到了什么:

public class Test{
    public static void main(String... args) {
        System.out.print(new java.util.Scanner(System.in).nextLine().chars().mapToObj(i -> ((char)i)-'0').reduce(0, (a,b)->a+b));
    }
}

但是我怎样才能证明那一行中正好有 3 位数字呢?

将您的代码包装在 Optional 中,使用 filter() 检查长度并使用 orElse() 为错误的长度输入提供输出:

System.out.print(Optional.of(new Scanner(System.in).nextLine())
    .filter(str -> str.matches("\d{3}")).map(str -> str.chars().sum() - '0' * 3)
    .orElse("invalid input"));

请注意,您可以替换:

.mapToObj(i -> ((char)i)-'0').reduce(0, (a,b)->a+b)

与:

.map(i -> ((char)i)-'0').sum()

或者,因为您刚好有 3 位数字,所以:

.sum() - '0' * 3

所以这可能是这样的。为可读性添加换行符

public static void main(String... args) {
        System.out.print(
                //Make input into String-Stream
                Arrays.asList(new java.util.Scanner(System.in).nextLine()).stream()
                //Throw away averything not three digits
                     .filter(s -> s.matches("\d{3}"))
                //Perform digit-sum (make it a String)
                    .map(e -> ""+e.chars().mapToObj(i -> ((char)i)-'0').reduce(0, (a,b)->a+b))
                //return this if there is something
                .findFirst()
                //Or give error message
                .orElse("No valid input!"));
    }

这个怎么样。缺少输出表示输入错误(因为您没有指定在这种情况下要做什么)。

Stream.of(new Scanner(System.in).nextLine()).
        // three digits
        filter(s->s.matches("\d{3}"))
        // convert to integer
        .map(Integer::valueOf)
        // find the sum
        .map(n->n/100 + (n/10)%10 + n%10)
        // and print it
        .forEach(System.out::println);

如果您想要错误消息,可以执行以下操作:

System.out.println(Stream.of(new Scanner(System.in)
              .nextLine())
              .filter(a -> a.matches("\d{3}"))
              .map(Integer::valueOf)
              .map(a -> a / 100 + (a / 10) % 10 + a % 10)
              // convert back to string
              .map(Object::toString)
              .findFirst()
              .orElse("Not 3 digits"));