将 Python 转换为 Java 8

Convert Python to Java 8

我在一个使用 java8 的项目中工作,这个项目是关于获取一些地理信息并使用它。 我已经在 python 中完成了这项工作的一部分,现在我正在将在 Python 中完成的这部分工作翻译成 java 8,在 Python 中我使用下面的这些行将 Google 格式的坐标转换为 Postgis 格式:

s1 = tuple(value.split(" "))
s2 = zip(s1[1::2], s1[::2])

例如:

我的入口是这样的:value = "11.12345679 12.987655 11.3434454 12.1223323”等等 上面的 Python 代码将入口更改为: s2 = "12.987655 11.12345679 12.1223323" 等等。

改变每个坐标对的位置,每个入口都有上千个坐标。 要使用 java 获得相同的效果(在 java 8 之前): 使用我对 java 的了解(在 java 8 之前获得),我需要这样做:

try {
    String result = "", right = "", left = "";
    String[] txt = str.split(" ");
    for (int i = 0; i < txt.length; i += 2) {
        right = txt[i];
        left = txt[i + 1];
        result += "," + left + " " + right;
    }
    return result.substring(1);
} catch (ArrayIndexOutOfBoundsException e) {
    return null;
}

我将执行上面的 java 代码数千次,我的问题是:Java 8 有一些新的方法来执行上面的代码,更像是 Python ?

我问这个问题的动机是因为我看到了关于 Java 8:

的新闻
List<String> someList = new ArrayList<>();
// Add some elements
someList.add("Generic (1.5)");
someList.add("Functional (8)");

// Open a stream
someList.stream()
// Turn all texts in Upper Case
.map(String::toUpperCase)
// Loop all elemnst in Upper Case
.forEach(System.out::println);

更新中:

Jean-François Savard 的解决方案非常完美,使用 Java 8 就像我问的那样,非常感谢 Jean-Francois Savard

String str = "11.12345679 12.987655 11.3434454 12.1223323 11.12345679 12.987655 11.3434454 12.1223323";
String[] strs = str.split(" "); 
str = IntStream.range(0, strs.length) .filter(i -> i % 2 == 0) .mapToObj(i -> strs[i + 1] + " " + strs[i]) .collect(Collectors.joining(","));
System.out.println(str);
>> 12.987655 11.12345679,12.1223323 11.3434454,12.987655 11.12345679,12.1223323 11.3434454

Vampire 和 Tukayi 给出的解决方案非常适合我的问题,非常感谢大家

String str = "11.12345679 12.987655 11.3434454 12.1223323 11.12345679
12.987655 11.3434454 12.1223323";
str = str.replaceAll("([^\s]+) ([^\s]+)(?: |$)", ", ").substring(1);
System.out.println(str);

Java 8 添加(除其他外)Lambdas、Streams 和功能接口。

您可以使用流来简化对对象的循环。但是你在 Python 中看到的语法与 java 中的语法不一样。

在 class 中定义以下内容以预编译 Regex 模式

private static final Pattern pattern = Pattern.compile("([^ ]++) ([^ ]++)(?: |$)");

然后在你的方法中使用

if ((new StringTokenizer(str, " ").countTokens() % 2) == 1) {
    return null;
}
return pattern.matcher(str).replaceAll(", ").substring(1);

获得与原始代码相同的结果。


如果您永远依赖于使用 Streams,这里有一个 Streams 解决方案

String[] strs = str.split(" ");
return IntStream.range(0, strs.length)
                .filter(i -> i % 2 == 0)
                .mapToObj(i -> strs[i + 1] + " " + strs[i])
                .collect(Collectors.joining(","));