Java Stream:如何仅更改流的第一个元素?

4

有一个ArrayList:

 public void mainMethod() {
     List<String> list = new ArrayList<>();
     list.add("'+7913152','2020-05-25 00:00:25'");
     list.add("'8912345','2020-05-25 00:01:49'");
     list.add("'916952','2020-05-25 00:01:55'");
 }

一种将字符串转换的方法:

 public String doTransform(String phone) {
     String correctNumber;
 ..... make some changes...
     return correctNumber;
 }


list.stream().forEach(line -> {
                Arrays.stream(line.split(","))... and what else? 

如何从子流(Arrays.stream)中仅获取第一个元素并将其传递给转换方法? 已经实现了“doTransform()”方法,所以不需要关心它。 我只需要将“+7913152”,“8912345”和“916952”分开,将它们传递给doTransform()并获得一个新的列表:
"'8913152','2020-05-25 00:00:25'"
"'8912345','2020-05-25 00:01:49'"
"'8916952','2020-05-25 00:01:55'" 

你的问题已经修改,请确保一次性输出所需结果。 - parrotjack
1
什么转换规则会将 '+7913152' 转化为 '8913152' - Holger
4个回答

3

请按以下方式进行:

List<String> result = list.stream()
                            .map(s -> {
                                    String[] parts = s.split(",");
                                    String st = doTransform(String.valueOf(Integer.parseInt(parts[0].replace("'", ""))));
                                    return ("'" + st + "'") + "," + parts[1];
                                }).collect(Collectors.toList());

演示:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("'+7913152','2020-05-25 00:00:25'");
        list.add("'8912345','2020-05-25 00:01:49'");
        list.add("'916952','2020-05-25 00:01:55'");

        List<String> result = list.stream()
                                    .map(s -> {
                                        String[] parts = s.split(",");
                                        String st = doTransform(String.valueOf(Integer.parseInt(parts[0].replace("'", ""))));
                                        return ("'" + st + "'") + "," + parts[1];
                                    }).collect(Collectors.toList());

        // Display
        result.forEach(System.out::println);
    }

    static String doTransform(String phone) {
        return "x" + phone;
    }
}

输出:

'x7913152','2020-05-25 00:00:25'
'x8912345','2020-05-25 00:01:49'
'x916952','2020-05-25 00:01:55'

1

我们可以使用 limitString split 中拆分元素,仅将其分为两部分(需要更改的初始部分和剩余字符串)。

List<String> list = list.stream()
  .map(input -> input.split(",", 2))
  .map(data -> String.join(",", doTransaform(data[0]), data[1]))
  .collect(Collectors.toList());

当您的字符串具有多个逗号(,)分隔的部分时,这将非常有用,而且肯定会提高效率。


1
我假设电话号码的长度为字符串,例如"'+7913152','2020-05-25 00:00:25'",如果长度超过7,则您将删除头部的其余数字并替换为8以使其成为有效号码。如果号码长度小于7,则只需添加8即可。注意:您可以处理号码长度为34等情况。
 public class PlayWithStream {
        public static void main(String[] args) {
             List<String> list = new ArrayList<>();
                list.add("'+7913152','2020-05-25 00:00:25'");
                list.add("'8912345','2020-05-25 00:01:49'");
                list.add("'916952','2020-05-25 00:01:55'");
      List<String> collect = list.stream()
                    .map(PlayWithStream::doTransform)
                    .collect(Collectors.toList());

        System.out.println(collect);
        }
         public static String doTransform(String phone1) {
             String []a=phone1.split(",");
             String phone=a[0];

                 boolean flag2 = phone.substring(0, 1).matches("[8]");
                 String finaloutput="";
                 if(!flag2) {
                int len=phone.length();

                if(len>7) {
                    String sub=phone.substring(0,phone.length()-6);
                    String newStr=phone.replace(sub, "");
                    finaloutput="8".concat(newStr);

                }else {
                    finaloutput="8".concat(phone);
                }

            }
            return finaloutput+","+a[1];
         }
    }

0
以下代码有效,

List<String> collect = list.stream()
                .map(a -> a.replace(String.valueOf(a.charAt(1)), "2"))
                .collect(Collectors.toList());


1
不仅仅是替换为“2”。可能会有更复杂的转换。但这并不重要。 - harp1814
这是我的输出:['212345','2020-05-25 00:00:25','212345','2020-05-25 00:01:49','212345','2020-05-25 00:01:55'] - parrotjack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接