JAVA : 如何在使用 lambda 处理数组项时减少代码大小
JAVA : how to reduce code size, when using lambda to process array's items
我必须按字母顺序对数组中的每一项进行排序
在 :
[bcdef、dbaqc、abcde、omadd、bbbbb]
出去 :
[bcdef, abcdq, abcde, addmo, bbbbb]
我写了下面的代码,但我觉得它很冗长。
能否请您告诉我另一种方式,代码更短?
谢谢。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import static java.lang.String.copyValueOf;
public class Main {
public static void main(String[] args) {
String[] stringsArray = { "bcdef", "dbaqc", "abcde", "omadd", "bbbbb"};
System.out.println(Arrays.toString(stringsArray));
List<String> list = Arrays.stream(stringsArray).map((String s)->{
char[] charArray = s.toCharArray();
Arrays.sort(charArray);
return copyValueOf(charArray);
}).collect(Collectors.toList());
ArrayList<String> arrayList = new ArrayList<String>(list);
stringsArray = Arrays.copyOf(arrayList.toArray(),arrayList.size(),String[].class);
System.out.println(Arrays.toString(stringsArray));
}
}
您似乎想对每个元素内的字符进行排序,而不是整个数组。
您可以通过单独的 map()
(和 peek()
,因为 Arrays.sort()
方法不返回值)步骤来简化。您还可以通过直接收集到 String
数组来跳过冗余 List
。
String[] sorted = Arrays.stream(stringsArray)
.map(String::toCharArray)
.peek(Arrays::sort)
.map(String::new)
.toArray(String[]::new);
如果你想修改原始数组 in-place,那么你可以依赖 Arrays.asList()
,它会在数组周围创建一个 List
包装器:
Arrays.asList(stringsArray)
.replaceAll(s -> {
char[] chars = s.toCharArray();
Arrays.sort(chars);
return new String(chars);
});
System.out.println(Arrays.toString(stringsArray));
Arrays.asList()
实际上只是原始数组的一个视图。对返回列表的任何更改实际上都将在数组上完成,并且 vice-versa。这也是为什么不能 add/remove 返回列表中的元素的原因。
我必须按字母顺序对数组中的每一项进行排序
在 : [bcdef、dbaqc、abcde、omadd、bbbbb] 出去 : [bcdef, abcdq, abcde, addmo, bbbbb]
我写了下面的代码,但我觉得它很冗长。
能否请您告诉我另一种方式,代码更短?
谢谢。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import static java.lang.String.copyValueOf;
public class Main {
public static void main(String[] args) {
String[] stringsArray = { "bcdef", "dbaqc", "abcde", "omadd", "bbbbb"};
System.out.println(Arrays.toString(stringsArray));
List<String> list = Arrays.stream(stringsArray).map((String s)->{
char[] charArray = s.toCharArray();
Arrays.sort(charArray);
return copyValueOf(charArray);
}).collect(Collectors.toList());
ArrayList<String> arrayList = new ArrayList<String>(list);
stringsArray = Arrays.copyOf(arrayList.toArray(),arrayList.size(),String[].class);
System.out.println(Arrays.toString(stringsArray));
}
}
您似乎想对每个元素内的字符进行排序,而不是整个数组。
您可以通过单独的 map()
(和 peek()
,因为 Arrays.sort()
方法不返回值)步骤来简化。您还可以通过直接收集到 String
数组来跳过冗余 List
。
String[] sorted = Arrays.stream(stringsArray)
.map(String::toCharArray)
.peek(Arrays::sort)
.map(String::new)
.toArray(String[]::new);
如果你想修改原始数组 in-place,那么你可以依赖 Arrays.asList()
,它会在数组周围创建一个 List
包装器:
Arrays.asList(stringsArray)
.replaceAll(s -> {
char[] chars = s.toCharArray();
Arrays.sort(chars);
return new String(chars);
});
System.out.println(Arrays.toString(stringsArray));
Arrays.asList()
实际上只是原始数组的一个视图。对返回列表的任何更改实际上都将在数组上完成,并且 vice-versa。这也是为什么不能 add/remove 返回列表中的元素的原因。