有没有办法用 java 8 流更改日期格式?

Is there a way to change dateFormat with java 8 stream?

我想在 java8 流

中用一行将日期格式从“dd/mm/yyyy”更改为“yyyy/mm/dd
List<String[]> date = new ArrayList<>();

String[] a= {"12/2/2018","a1","a2"};
String[] b= {"13/3/2018","b1","b2"};
String[] c= {"14/4/2018","c1","c2"};

date.add(a)`
date.add(b);
date.add(c);

我希望输出是

{{"2018/2/12","a1","a2"},{"2018/2/13","b1","b2"},{"2018/2/14","c1","c2"}}

我希望你的意思是 yyyy/MM/dd 因为 m 代表分钟,M 代表月...

考虑来自流的 Map API

public static void main(String[] args) {
    List<String[]> date = new ArrayList<>();
    String[] a= {"12/2/2018","a1","a2"};
    String[] b= {"13/3/2018","b1","b2"};
    String[] c= {"14/4/2018","c1","c2"};

    date.add(a);
    date.add(b);
    date.add(c);


    List<String[]> even = date.stream().map(
            s -> {
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/M/yyyy");
                LocalDate localDate = LocalDate.parse(s[0], formatter);
                DateTimeFormatter formatterNew = DateTimeFormatter.ofPattern("yyyy/MM/dd");
                return new String[]{formatterNew.format(localDate), s[1],s[2]};
            }
    ).collect(Collectors.toList());
    even.forEach(x-> System.out.println(Arrays.toString(x)));
}

将打印出来

[2018/02/12, a1, a2]

[2018/03/13, b1, b2]

[2018/04/14, c1, c2]

如果不遍历所有项目,则无法执行此操作。

对于你的简单案例 dd/mm/yyyyyyyy/mm/dd 你可以只使用这个:

date.forEach(i -> {
    String[] parts = i[0].split("/");
    i[0] = parts[2] + "/" + parts[1] + "/" + parts[0];
});

使用 java 时间 api 你可以使用这个:

DateTimeFormatter toFormat = DateTimeFormatter.ofPattern("yyyy/M/d");
DateTimeFormatter fromFormat = DateTimeFormatter.ofPattern("d/M/yyyy");
date.forEach(i -> i[0] = LocalDate.parse(i[0], fromFormat).format(toFormat));

您可以使用 java 8 个流来完成此操作,但不能在一行中进行。使用两种日期模式,一种用于输入,另一种用于输出

DateTimeFormatter inFormat = DateTimeFormatter.ofPattern("dd/M/yyyy");
DateTimeFormatter outFormat = DateTimeFormatter.ofPattern("yyyy/M/dd");

    List<String[]> date = new ArrayList<>();

    String[] a= {"12/2/2018","a1","a2"};
    String[] b= {"13/3/2018","b1","b2"};
    String[] c= {"14/4/2018","c1","c2"};

    date.add(a);
    date.add(b);
    date.add(c);

    //Since it is String array need lambda expression to update and return      

    List<String[]> result = date.stream().map(arr->{
        arr[0]=LocalDate.parse(arr[0],inFormat).format(outFormat);
        return arr;
    }).collect(Collectors.toList());

为什么要使用流?

    DateTimeFormatter originalFormatter = DateTimeFormatter.ofPattern("d/M/u");
    DateTimeFormatter wantedFormatter = DateTimeFormatter.ofPattern("u/M/d");
    date.forEach(arr -> {
        LocalDate ld = LocalDate.parse(arr[0], originalFormatter);
        arr[0] = ld.format(wantedFormatter);
    });

检查结果:

    date.forEach(arr -> System.out.println(Arrays.toString(arr)));

输出:

[2018/2/12, a1, a2]
[2018/3/13, b1, b2]
[2018/4/14, c1, c2]

我的代码(以及其他一些答案中的代码)修改了您的原始数组。请决定是否可以。如果是,你不应该真正使用流,因为它们应该没有副作用。如果您确实需要原始数组保持不变,流就可以了(使用与以前相同的格式化程序):

    List<String[]> newDateList = date.stream()
            .map(arr -> {
                LocalDate ld = LocalDate.parse(arr[0], originalFormatter);
                String[] newArr = Arrays.copyOf(arr, arr.length);
                newArr[0] = ld.format(wantedFormatter);
                return newArr;
            })
            .collect(Collectors.toList());

    newDateList.forEach(arr -> System.out.println(Arrays.toString(arr)));

输出与之前相同。