当前位置: 首页 > 知识库问答 >
问题:

如何使用streams和lambda编写此方法?

晏树
2023-03-14

今天在编程课上我们从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时第一个任务会是什么样子,我将非常感激。我会自己试试另外两个。

问候

共有1个答案

谢承
2023-03-14

第一个任务是编写一个方法,计算列表中偶数的平均值。

重点是更改装箱的

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