今天在编程课上我们从streams和Lambda开始,我要做一个练习。
第一个任务是编写一个方法,计算列表中偶数的平均值。我已经编写了这段代码,但显然我没有使用流。
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);
}
编辑解决方案:
int sum = list.stream().filter(integer -> integer % 2 == 0).mapToInt(Integer::intValue).sum();
long count = list.stream().filter(integer -> integer % 2 == 0).count();
第二个任务是编写一个方法,选择所有以“a”(不区分大小写)开头或有3个字符的字符串,并将其更改为大写。我的代码:
public static List<String> upperCase(List<String> list) {
for(int i = 0; i < list.size(); i++){
if(list.get(i).length() == 3 || Character.toString(list.get(i).charAt(0)).equalsIgnoreCase("a")){
list.set(i, list.get(i).toUpperCase());
}
}
return list;
}
编辑:解决方案:
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;
最后一个任务是返回列表,但将“g”添加到偶数,将“u”添加到奇数。我的代码:
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;
如果有人能告诉我使用streams时第一个任务会是什么样子,我将非常感激。我会自己试试另外两个。
问候
第一个任务是编写一个方法,计算列表中偶数的平均值。
重点是更改装箱的流
double average = list.stream().mapToInt(i -> i).average().getAsDouble;
请记住,如果在
OptionalDouble
中没有平均值,则可能会抛出NoTouchElementException
。
第二个任务是编写一个方法,选择所有以“a”(不区分大小写)开头或有3个字符的字符串,并将其更改为大写。
流末尾的
forEach
方法是一个终端操作,需要一个使用者
,该使用者使用该方法。尽管您调用了toUpperCase
,但它不会更改原始集合,并且会抛出结果(除非您将其打印出来)。
您想使用方法
map
执行合格字符串的映射。只要你只想修改这些值并同时保留剩余的值,你就不能使用filter
,只要它能修改流式传输的项目数量。这样做:
List<String> newListOfStrings = listOfStrings.stream()
.map(string -> string.length() == 3 || string.startsWith("a") ?
string.toUpperCase() : string)
.collect(Collectors.toList());
注意,我使用了更易于使用的
startsWith
方法。不过,您使用的charAt
并没有错误。
最后一个任务是返回列表,但将“g”添加到偶数,将“u”添加到奇数。
不是最好的,但相当可接受的解决方案是再次使用映射方法
map
,最后使用Collectors.joining (",")
将项目连接到带有分隔符的字符串。因此,您不需要费心使用,
字符。
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(","));
但是,如果我要实现第三个,我会在每次迭代中使用simple和适用于字符串连接的
StringBuilder
:
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);
... 或者使用带有
String.join
方法的新集合。。。
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);
我在这里有一段代码,基本上只是创建一个等于参数的线程数,在每个线程中实例化一个MyRunnable对象,将线程添加到线程列表中,然后根据for循环的迭代设置线程的名称。 我的问题是,有没有更干净的方法?是否可以使用流将此功能封装在lambda中?
嗨,我有一个代码块,它将一种窗口对象的列表转换为另一种,并将其填充到一个地图中,由ID键控。可能有许多具有相同id但具有不同名称和属性的对象实例。我所做的是做一个列表[W1(1,2,3),W1(2,3,4),W2(1,3,4)...]并将其转换为映射[键W1,值(1,2,3),(2,3,4)键W2,....] 我想知道我是否可以使用流和lambdas来崩溃这个。 list.stream().col
问题内容: 谁能帮助我获取下面提到的JPA查询的JPA标准查询。 问题答案: 假设Person与语言有关,这就是您在较早的Hibernate中所做的事情: 我第一次尝试使用JPA 2.0: 请让我知道这是否适合您。 编辑: 更新查询以仅使用一个呼叫。
问题内容: 我有此查询,它运行良好 从此查询中,我从我的位置(这是我的第一张表)中选择所有3 KM的餐厅。 但是我需要从3Km中的食品接头中选择AVG等级。 该查询也运行完美: 但是我需要添加这两个查询,通过它们我可以选择所有那些食品接头及其等级AVG。 问题答案: 只需放置子查询,您将得到结果:
我应该创建一个方法,该方法接受客户的ID,然后如果找到该ID,则返回数组中的索引。该方法只接受整数ID。 我使用迭代二进制搜索来搜索我的客户数组列表。但问题是,在将客户数组与整数进行比较时,它会陷入操作数类型的困境。我曾尝试将方法类型更改为static、CustomerList、Customer等,但这根本不会影响它。 代码中的cl是我在课程开始时创建的公共字段。 作为-- 它应该接受一个Cust