【发布时间】:2016-12-14 08:10:23
【问题描述】:
我在一个使用 java 8 的项目中工作,这个项目是关于获取一些地理信息并使用它。 我已经在 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]+)(?: |$)", ",$2 $1").substring(1);
System.out.println(str);
【问题讨论】:
-
也许显示示例输入和输出会更容易;除了显示代码并告诉我们:这是应该发生的。并提示:忽略数组越界;并且只返回 null 看起来像一个错误。你知道,你的处理出错了(因为你做错了什么,或者意外的输入)......你就忽略了?!
-
return = result.substring(1);会编译吗? -
有没有机会利用jython?这无疑是最快的选择 - 无需转换。
-
无论如何,您都可以使用您的非Java8知识编写Java代码。我建议你从那里开始,然后尝试应用流和 lambda,如果可以的话
-
好吧,问题已经结束,所以在这里你可以作为评论: String[] strs = str.split(" "); IntStream.range(0, strs.length) .filter(i -> i % 2 == 0) .mapToObj(i -> strs[i + 1] + " " + strs[i]) .collect(Collectors.joining (","));