Java 如何使用streams和lambda编写此方法?
今天在编程课上我们从streams和Lambda开始,我要做一个练习 第一个任务是编写一个方法,计算列表中偶数的平均值。我已经编写了这段代码,但显然我没有使用流Java 如何使用streams和lambda编写此方法?,java,lambda,java-stream,Java,Lambda,Java Stream,今天在编程课上我们从streams和Lambda开始,我要做一个练习 第一个任务是编写一个方法,计算列表中偶数的平均值。我已经编写了这段代码,但显然我没有使用流 public static double average(List<Integer> list) { double sum = 0; int i = 0; for (Integer integer : list) { if (integer % 2 == 0) {
public static double average(List<Integer> list) {
double sum = 0;
int i = 0;
for (Integer integer : list) {
if (integer % 2 == 0) {
i++;
sum += integer;
}
}
return (sum / i);
}
第二个任务是编写一个方法,选择所有以“a”(不区分大小写)开头或有3个字符的字符串,并将其更改为大写。
我的代码:
公共静态列表大写(列表){
对于(int i=0;i
编辑:解决方案:
int sum = list.stream().filter(integer -> integer % 2 == 0).mapToInt(Integer::intValue).sum();
long count = list.stream().filter(integer -> integer % 2 == 0).count();
public static List<String> upperCase(List<String> list) {
List<String> newListOfStrings = list.stream().map(string -> string.length() == 3 ||
Character.toString(string.charAt(0)).equalsIgnoreCase("a") ? string.toUpperCase() : string).collect(Collectors.toList());
return newListOfStrings;
公共静态列表大写(列表){
List newListOfStrings=List.stream().map(字符串->字符串.length()==3||
Character.toString(string.charAt(0)).equalsIgnoreCase(“a”)?string.toUpperCase():string).collect(collector.toList());
返回newlistofstring;
最后一个任务是返回列表,但将“g”添加到偶数,将“u”添加到奇数。
我的代码:
公共静态字符串getString(列表){
字符串s=“”;
用于(整数:列表){
如果(整数%2==0){
s+=integer.toString()+“g,;}
否则{
s+=integer.toString()+“u”;
}
}
返回s.substring(0,s.length()-1);
}
编辑:解决方案:
public static String getString (List < Integer > list) {
String result = list.stream()
.map(integer -> integer % 2 == 0 ?
String.format("%d%s", integer, "g") : String.format("%d%s", integer, "u"))
.collect(Collectors.joining(","));
return result;
公共静态字符串getString(ListList){
字符串结果=list.stream()
.map(整数->整数%2==0?
String.format(“%d%s”,整数,“g”):String.format(“%d%s”,整数,“u”))
.collect(收集器。连接(“,”);
返回结果;
如果有人能告诉我第一个任务是如何处理streams的,我会非常感激。我会自己尝试另外两个任务
问候
第一个任务是编写一个方法,计算列表中偶数的平均值
重点是更改装箱的流
第一个任务是编写一个方法,计算列表中偶数的平均值
关键是要更改装箱的流到目前为止您尝试了什么?我想我必须这样开始:“list.stream().forEach…我的问题是我不知道如何在流中实现if条件。流中的if条件是使用filter()完成的
。您是否阅读了文档,即的javadoc,以了解哪些方法可供您使用?---向下投票的问题,因为它“没有显示任何研究成果”(引用向下投票按钮的工具提示)。你是对的,我没有阅读文档。这对我来说是非常困难的。我现在有以下代码:optionalduble-sum=list.stream().filter(integer->integer%2==0)。mapToDouble(integer::intValue)。average()
有更好的实现方法吗?我想去掉OptionalDouble,因为它的任务是返回一个正常的Double。请不要在评论中添加更多信息,始终更新您的问题。到目前为止您尝试了什么?我想我必须这样开始:“list.stream().forEach…我的问题是我不知道如何在流中实现if条件。流中的if条件是使用过滤器()完成的。
。您是否阅读了文档,即的javadoc,以查看您可以使用哪些方法?---问题被否决,因为它“没有显示任何研究工作”(引用向下投票按钮的工具提示)。你是对的,我没有阅读文档。这对我来说非常重要。我现在有以下代码:optionalduble-sum=list.stream().filter(integer->integer%2==0)。mapToDouble(integer::intValue)。average()有更好的实现方法吗?我想去掉可选的Double,因为任务是返回一个普通的Double。请不要在评论中添加更多信息,始终更新您的问题。a(而不是StringBuilder
)怎么样最后一个例子?@OleV.V.:我在考虑这个问题,但是你必须在循环中用“g”
或“u”
连接一个整数(使用String.format
),因为调用StringJoiner::add
会放置一个新的定界符。你能举个例子吗?因为我如此喜欢流,所以我只做list.stream().mapToInt(Integer::valueOf).mapToObj(i->i%2==0?i+“g”:i+“u”).collect(Collector.joining(“,”)
)。请随意反对。:-mapToInt
,您可以直接映射到字符串(输入列表是list
,因此:list.stream().map(i->i%2==0?i+“g”:i+“u”).collector.joining(“,”)
。+
处理转换。此外,我想避免在第一种情况下使用+
进行字符串连接。我是否遗漏了什么?品味问题。我喜欢连接。也许如果我们更好地理解OP为什么需要该输出,我们会更好地了解它是好是坏。PS我不喜欢puttin但是,在连接中,首先是int
。我可能会执行“+I+”g
,甚至是字符串。valueOf(I)+'g'
。最后一个是a(而不是StringBuilder
)怎么样?@OleV.V:我在考虑这个问题,但是你必须将一个整数连接到“g”
或“u”
在循环内部(使用String.format
),因为调用StringJoiner::add
放置了一个新的分隔符。你能提供一个例子吗?因为如此喜欢流,我只需要做list.stream().mapToInt(Integer::valueOf).mapToObj(I->I%2==0?I+“g”:I+“u”).collector.joining(“,”)
。请随意反对。:-mapToInt
不需要,您可以直接映射到字符串(输入列表是list
,因此:list.stream().map(i
public static String getString(List<Integer> list){
String s = "";
for(Integer integer : list){
if(integer % 2 == 0){
s += integer.toString() + "g,";}
else {
s += integer.toString()+ "u,";
}
}
return s.substring(0, s.length()-1);
}
public static String getString (List < Integer > list) {
String result = list.stream()
.map(integer -> integer % 2 == 0 ?
String.format("%d%s", integer, "g") : String.format("%d%s", integer, "u"))
.collect(Collectors.joining(","));
return result;
double average = list.stream().mapToInt(i -> i).average().getAsDouble;
List<String> newListOfStrings = listOfStrings.stream()
.map(string -> string.length() == 3 || string.startsWith("a") ?
string.toUpperCase() : string)
.collect(Collectors.toList());
String result = list.stream()
.map(integer -> integer % 2 == 0 ? integer + "g" : integer + "u")
.collect(Collectors.joining(","));
// I find String.format better than using +
String result = list.stream()
.map(integer -> integer % 2 == 0 ?
String.format("%d%s", integer, "g") : String.format("%d%s", integer, "u"))
.collect(Collectors.joining(","));
StringBuilder sb = new StringBuilder();
for (Integer integer: list) {
sb.append(integer);
if (integer % 2 == 0) {
sb.append("g,");
} else {
sb.append("u,");
}
}
String result = sb.toString().substring(0, sb.length() - 1);
List<String> newList = new ArrayList<>();
for (Integer integer: list) {
String toAdd = integer % 2 == 0 ?
String.format("%d%s", integer, "g") :
String.format("%d%s", integer, "u");
newList.add(toAdd);
}
String result = String.join(",", newList);