将 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(","));
我在一个使用 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(","));