Java8:将字符串数组转换为第一个大写字符并按排序顺序排列

Java8:将字符串数组转换为第一个大写字符并按排序顺序排列,java,arrays,string,java-8,java-stream,Java,Arrays,String,Java 8,Java Stream,我有一个字符串数组,如: String[] strArray = { "Red", "green", "Blue", "Yellow", "violet", "magenta", "pURPLE" }; 我想把它转换成一个数组,这样给定数组中的所有字符串都有大写的第一个字符。预期产出应为: [Blue, Green, Magenta, PURPLE, Red, Violet, Yellow] 最后应该对数组进行排序(只需添加sorted() 我正在尝试,但它不起作用: System.out.

我有一个字符串数组,如:

String[] strArray = { "Red", "green", "Blue", "Yellow", "violet", "magenta", "pURPLE" };
我想把它转换成一个数组,这样给定数组中的所有字符串都有大写的第一个字符。预期产出应为:

[Blue, Green, Magenta, PURPLE, Red, Violet, Yellow]
最后应该对数组进行排序(只需添加
sorted()

我正在尝试,但它不起作用:

System.out.println(Arrays.stream(strArray)
                .map((String x) -> {x=(x != null ? (x.substring(0,1).toUpperCase() + x.substring(1, x.length())) : "");})
                .sorted()
                .collect(Collectors.toList()));
我得到了这个错误:

The method map(Function<? super String,? extends R>) in the type Stream<String> is not applicable for the arguments ((String x) -> {})

方法映射(函数您需要在map()中的方法中返回新字符串-xs输入值,并且必须提供映射值:

    String[] strArray = { "Red", "green", "Blue", "Yellow", "violet", "magenta", "pURPLE" };
    System.out.println(Arrays.stream(strArray)
            .map((String x) -> { return (x != null ? (x.substring(0,1).toUpperCase() + x.substring(1, x.length())) : "");})
            .sorted()
            .collect(Collectors.toList()));
稍微短一点:

    String[] strArray = { "Red", "green", "Blue", "Yellow", "violet", "magenta", "pURPLE" };
    System.out.println(Arrays.stream(strArray)
            .map(x -> x != null ? (x.substring(0,1).toUpperCase() + x.substring(1, x.length())) : "")
            .sorted()
            .collect(Collectors.toList()));

您需要在map()中的方法中返回新字符串-xs输入值,并且必须提供一个映射值:

    String[] strArray = { "Red", "green", "Blue", "Yellow", "violet", "magenta", "pURPLE" };
    System.out.println(Arrays.stream(strArray)
            .map((String x) -> { return (x != null ? (x.substring(0,1).toUpperCase() + x.substring(1, x.length())) : "");})
            .sorted()
            .collect(Collectors.toList()));
稍微短一点:

    String[] strArray = { "Red", "green", "Blue", "Yellow", "violet", "magenta", "pURPLE" };
    System.out.println(Arrays.stream(strArray)
            .map(x -> x != null ? (x.substring(0,1).toUpperCase() + x.substring(1, x.length())) : "")
            .sorted()
            .collect(Collectors.toList()));
您可以使用此方法

System.out.println(Arrays.stream(strArray)
            .filter(Objects::nonNull)
            .map(s->Character.toUpperCase(s.charAt(0))+ s.substring(1))
            .sorted()
            .collect(Collectors.toList()));
您可以使用此方法

System.out.println(Arrays.stream(strArray)
            .filter(Objects::nonNull)
            .map(s->Character.toUpperCase(s.charAt(0))+ s.substring(1))
            .sorted()
            .collect(Collectors.toList()));

您收到上述编译错误是因为您决定为
map
函数使用lambda语句块,并且决定不包含
return
语句

map
函数将类型为
T
的元素转换为
R
,因此如果决定使用lambda语句块,则需要显式提供
return
语句,唯一不需要提供显式return语句的情况是使用lambda表达式

其他答案显示了如何使用流完成手头的任务。没有流的另一个变体是:

//copy the array of strings to a list of strings
List<String> stringList = new ArrayList<>(Arrays.asList(strArray));
// remove null
stringList.removeIf(Objects::isNull); 
// do replacing
stringList.replaceAll(s -> Character.isUpperCase(s.charAt(0)) ? 
            s : Character.toUpperCase(s.charAt(0))+ s.substring(1));
// sort the list
tempList.sort(Comparator.naturalOrder()); 
//将字符串数组复制到字符串列表中
List-stringList=newarraylist(Arrays.asList(strArray));
//删除空值
removeIf(Objects::isNull);
//做替换
stringList.replaceAll(s->Character.isUpperCase(s.charAt(0))?
s:Character.toUpperCase(s.charAt(0))+s.substring(1));
//对列表排序
sort(Comparator.naturalOrder());

您收到上述编译错误是因为您决定将lambda语句块用于
map
函数,并且决定不包含
return
语句

map
函数将类型为
T
的元素转换为
R
,因此如果决定使用lambda语句块,则需要显式提供
return
语句,唯一不需要提供显式return语句的情况是使用lambda表达式

其他答案显示了如何使用流完成手头的任务。没有流的另一个变体是:

//copy the array of strings to a list of strings
List<String> stringList = new ArrayList<>(Arrays.asList(strArray));
// remove null
stringList.removeIf(Objects::isNull); 
// do replacing
stringList.replaceAll(s -> Character.isUpperCase(s.charAt(0)) ? 
            s : Character.toUpperCase(s.charAt(0))+ s.substring(1));
// sort the list
tempList.sort(Comparator.naturalOrder()); 
//将字符串数组复制到字符串列表中
List-stringList=newarraylist(Arrays.asList(strArray));
//删除空值
removeIf(Objects::isNull);
//做替换
stringList.replaceAll(s->Character.isUpperCase(s.charAt(0))?
s:Character.toUpperCase(s.charAt(0))+s.substring(1));
//对列表排序
sort(Comparator.naturalOrder());

在这里的sorted()方法中不需要比较器,因为默认值与
比较器相同。比较(s->s))
字符。toUpperCase
返回字符。我假设由于
s.substring
?非常简单的解决方案,它被转换为字符串。如果您有
org.apache.commons.lang3.StringUtils
,那么map调用会变得更简单,因为
map(StringUtils::capitalize)
这里不需要sorted()方法中的比较器,默认情况下,与Comparator.comparing(s->s)相同。
字符。toUpperCase
返回字符。我假设由于
s.substring
?非常简单的解决方案,它被转换为字符串。如果您有
org.apache.commons.lang3.StringUtils
,那么map调用会变得更简单,因为
map(StringUtils::capitalize)
是一个简单的印刷错误。lambda表达式必须
返回值,而不是为参数赋值。因此,您必须编写
.map((字符串x)->{x=(…);})
,而不是
.map((字符串x)->{return(…);})
,或者使用缩写形式
.map(x->(…)
。这是一个简单的印刷错误。lambda表达式必须
返回值,而不是为参数赋值。因此,您必须编写
.map((字符串x)->{x=(…);})
,而不是
.map((字符串x)->{return(…);})
,或者使用缩写形式
.map(x->(…)