Java 8字符串中奇数位置字符和的替代方案?

Java 8字符串中奇数位置字符和的替代方案?,java,string,java-8,java-stream,Java,String,Java 8,Java Stream,好奇地想知道在Java8中是否有一种更优雅的方法来寻找字符串中奇数位置的数字和 这是我目前的职责 /** * Explode string into char array, get sum of ASCII values at odd positions and divide by 10 to convert * to the integer value from that character * @param ccNumber string * @return int sum */

好奇地想知道在Java8中是否有一种更优雅的方法来寻找字符串中奇数位置的数字和

这是我目前的职责

 /**
 * Explode string into char array, get sum of ASCII values at odd positions and divide by 10 to convert
 * to the integer value from that character
 * @param ccNumber string
 * @return int sum
 */
int calculateSumOfOddDigits(final String ccNumber) {
    final char[] digits = ccNumber.toCharArray();
    return (digits[0] + digits[2] + digits[4] + digits[6] + digits[8] + digits[10] + digits[12] + digits[14]) / 10;
}
仍然不熟悉Streams和Java 8,并认为您可以这样做:

 ccNumber.chars().mapToObj(x -> (char) x {
        ..add odd position digits

    })

欢迎任何建议。

像这样的建议怎么样:

String str = "01234";
Integer sum = IntStream.range(0, str.length())
                       .filter(i -> i % 2 == 0)
                       .map(str::charAt)
                       .sum();
System.out.println(sum);

像这样的东西怎么样:

String str = "01234";
Integer sum = IntStream.range(0, str.length())
                       .filter(i -> i % 2 == 0)
                       .map(str::charAt)
                       .sum();
System.out.println(sum);

问题是:如果您想对索引进行筛选,那么转换为字符流是没有用的,因为您会丢失索引信息

但是,可以将索引视为流,并使用.Mp()将其转换为char值。类似的情况如下:

不确定这是否有效,但你明白了


另外:这远不如简单的for循环有效,所以我不想这样做。

问题是:如果要对索引进行筛选,转换为字符流是没有用的,因为您丢失了索引信息

但是,可以将索引视为流,并使用.Mp()将其转换为char值。类似的情况如下:

不确定这是否有效,但你明白了



另外:这远不如简单的for循环有效,所以我不想这样做。

从一个普通的非流循环开始怎么样?或者你总是期望你的字符串正好有15个字符长吗?你有没有试过仅仅做一个for循环?也许通过这种方式迭代每个奇怪的字符?您的代码正确吗?似乎需要将每个字符除以10。另外,默认情况下,Java
char
s不是ascii编码,您必须首先转换它们。可能重复的@jornverene Java
String
char
类型定义为UTF-16,其低范围对应于ascii。我不知道10的除法应该做什么。从一个普通的非流循环开始怎么样?或者你总是期望你的字符串正好有15个字符长吗?你有没有试过仅仅做一个for循环?也许通过这种方式迭代每个奇怪的字符?您的代码正确吗?似乎需要将每个字符除以10。另外,默认情况下,Java
char
s不是ascii编码,您必须首先转换它们。可能重复的@jornverene Java
String
char
类型定义为UTF-16,其低范围对应于ascii。我不知道10除法应该做什么。我认为直接从流上下文中访问数据通常是不好的做法。它主要是不可伸缩的。@YoYo:像这个答案那样访问一个不可变的、随机访问的数据结构没有什么错。为什么它不能扩展?在当前的实现(Java 8)中,它实际上比原始的
chars()
implementation…@Holger您使用流是因为它的惰性和并行化的可能性。如果字符串是8GB文件,该怎么办<代码>拆分器不能来救援-不是那样的。你怎么能切换到Spark RDD?不是那样的。很好的工具,适合这个答案。非常不幸的是,没有能够生成(位置、字符)元组流的内置组件。@YoYo:如果没有可随机访问的数据结构,就无法访问它。这并不能解释为什么在有这样一个结构的时候访问它是“坏习惯”。它确实具有规模;您可以处理任意长度的字符串,只要字符串可以得到。如果用8GB文件替换字符串,则不是在尝试缩放,而是在重新定义任务。@Holger根据上下文,您是对的。然而,在这种情况下,我发现在Java8流中表达这个问题的解决方案没有任何好处。可以说,相对于一个简单的循环解决方案,可读性并没有得到改善。然后设置和生成惰性序列肯定会增加开销。我认为直接从streams上下文访问数据通常是不好的做法。它主要是不可伸缩的。@YoYo:像这个答案那样访问一个不可变的、随机访问的数据结构没有什么错。为什么它不能扩展?在当前的实现(Java 8)中,它实际上比原始的
chars()
implementation…@Holger您使用流是因为它的惰性和并行化的可能性。如果字符串是一个8GB的文件呢<代码>拆分器不能来救援-不是那样的。你怎么能切换到Spark RDD?不是那样的。很好的工具,适合这个答案。非常不幸的是,没有能够生成(位置、字符)元组流的内置组件。@YoYo:如果没有可随机访问的数据结构,就无法访问它。这并不能解释为什么在有这样一个结构的时候访问它是“坏习惯”。它确实具有规模;您可以处理任意长度的字符串,只要字符串可以得到。如果用8GB文件替换字符串,则不是在尝试缩放,而是在重新定义任务。@Holger根据上下文,您是对的。然而,在这种情况下,我发现在Java8流中表达这个问题的解决方案没有任何好处。可以说,相对于一个简单的循环解决方案,可读性并没有得到改善。然后设置和生成惰性序列肯定会增加开销。
IntStream.range(0, ccNumber.length())
  .filter(i -> i % 2 == 0)
  .map(i -> ccNumber.charAt(i))
  .collect(Collectors.sum());