是否有一种方便的Java8流API方式从List<T> to Map<T, (index)>以下示例进行转换:
List<Character> charList = "ABCDE".chars().mapToObj(e->(char)e).collect(Collectors.toList());
Map<Character, Integer> map = new HashMap<>();
for (int i = 0; i < charList.size(); i++) {
map.put(charList.get(i), i);
}
Run Code Online (Sandbox Code Playgroud)
映射= {A = 0,B = 1,C = 2,D = 3,E = 4}
很想知道是否有更优雅的方法试图在Java 8中找到字符串中奇数位置的数字总和.
这是我目前的职能
/**
* 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;
}
Run Code Online (Sandbox Code Playgroud)
还不熟悉Streams和Java 8,想想也许你可以这样做:
ccNumber.chars().mapToObj(x -> (char) x {
..add odd position …Run Code Online (Sandbox Code Playgroud) 是否可以使用 Streams 过滤器访问列表的索引?我的意思是...我知道可以使用循环(while、for 等)来做到这一点,但就好像列表在变成流时会丢失有关索引的信息。
我想是这样的:
list.stream().filter(x -> x > 100)
.fiter(--getIndexOfEachValue--)
.collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)
如果我有 List=[10,200,30,150,400,30]...
我期望结果=[1,3,4]
我找不到使用当前对象和当前索引调用 lamda 的 forEach 方法。
不幸的是,这在 java8 中没有实现,所以下面的实现是不可能的:
List<String> list = Arrays.asList("one", "two");
list.forEach((element, index) -> System.out.println(String.format("[%d] : %s", index, element)));
Run Code Online (Sandbox Code Playgroud)
我知道一个简单的方法是使用带有索引整数的 for each 循环:
List<String> list = Arrays.asList("one", "two");
int index = 0;
for (String element : list) {
System.out.println(String.format("[%d] : %s", index++, element));
}
Run Code Online (Sandbox Code Playgroud)
我认为初始化索引整数并为每次迭代增加它的通用代码应该移到一个方法中。所以我定义了自己的forEach方法:
public static <T> void forEach(@NonNull Iterable<T> iterable, @NonNull ObjIntConsumer<T> consumer) {
int i = 0;
for (T t : iterable) {
consumer.accept(t, i++);
}
}
Run Code Online (Sandbox Code Playgroud)
我可以像这样使用它:
List<String> list = Arrays.asList("one", "two"); …Run Code Online (Sandbox Code Playgroud)