java9 的语法几乎没有变化

2017-06-03 18:47:09 +08:00
 zgqq

距离 java9 发布还有两个月,可惜语法居然没啥变化,现在 java 的语法糖实在太少了,写久了有点没意思啊

8460 次点击
所在节点    Java
68 条回复
msg7086
2017-06-04 11:10:04 +08:00
Java 本来就是个工业化的语言,适合一大堆不同风格的人凑一起写代码。
因为技巧少,语法糖少,写法死板,所以大家都能写出一样的代码来,适合码农式的开发环境。
Python 也差不多,提倡 Pythonic 就是为了擦除不同人之间的个性,大家都写出一样的代码来,读别人的代码也简单。

你想要写起来爽,为什么不去找一个一开始就写起来爽的语言呢。
sagaxu
2017-06-04 11:19:43 +08:00
@WispZhan C++的范型一样是语法糖,C 语言没有范型,就要复制粘贴代码了? C++的确定性析构,在 C 里一样可以用 goto 实现啊,也算是语法糖。高级语言本身可不就是低级语言的语法糖么?
yidinghe
2017-06-04 11:34:15 +08:00
语法变化不大,主要是结构化和新增一些 API。
zgqq
2017-06-04 11:35:33 +08:00
@msg7086 现在项目都是用 java,主要是 java 的语法写得太腻了,没有新鲜感
sagaxu
2017-06-04 11:40:26 +08:00
@msg7086 代码可读性强弱是因为语法吗?我觉得不是,宏观的架构,和微观的算法,加上对业务的理解,才是可读性的关键。用 Java 大家都写出一样的代码?不一定。

四种不同的循环的写法,对可读性的影响,远不如一个简单的算法,不信去看 ACM 解题的 Java 代码,有时行行都懂,就是看不明白原理。
SilenceCode
2017-06-04 14:54:08 +08:00
主要结构性变化
darouwan
2017-06-04 17:40:10 +08:00
我真的不懂要那么多语法糖干什么。。。
CRVV
2017-06-04 17:41:53 +08:00
@sagaxu 求指导怎么在不复制粘贴的情况下用 C 实现范型的 std::sort
msg7086
2017-06-04 17:51:36 +08:00
@sagaxu 我说的可读性是指在同等水平下写出来的代码的可读性。

比如之前我出过的一道面试练习题:

螺旋形打印出一个二维数组,比如

spiral_print([
['a','b','c','d'],
['e','f','g','h'],
['i','j','k','l']
]) # -> 'aeijklhdcbfg'

spiral_print([
['a','b','c','d']
]) # -> 'abcd'

这题用 Ruby 写的话,答案是这样的:

def spiral_print m
m.empty? ? '' : m.map(&:shift).join + spiral_print(m.reverse.transpose)
end

你可以试着用 Java 写一下,然后横向对比一下可读性。
tlday
2017-06-04 17:57:12 +08:00
@sagaxu 你走另一个极端了,语法糖有优点有缺点。语法糖的极致就是 ruby 这样,我也写 ruby,但是我会尽一切可能避免在重量级产品环境中使用类似 ruby 这种语言,它写起来很爽,我可以用 ruby 炫技,写出各种让你“还有这种操作”的代码,但是维护的时候,特别是换人维护的时候,会是噩梦。
我对 kotlin 持开放态度,它解决了很多问题,提升了很多开发效率,我相信 android 或类似的领域,kotlin 会大放异彩。但是 java 就是 java,更少的语法糖就是 java 的优势,它不叫 jetlin,它没有必要成为另一个 kotlin。已经有一个 kotlin 在这里了,我们为什么要创造另一个 jetlin 呢。我认为我们这个帖子是在讨论 java,你说呢?
micean
2017-06-04 18:33:06 +08:00
写了这么多年 java,都为需求头疼,从来没为语法糖头疼
一方面讨厌括号深嵌套,另一方面又赞赏各种炫酷的语法糖
做人为什么要这么纠结……
yin 神有句话我很赞同,别用肉眼去 parse
Guaidaodl
2017-06-04 18:39:04 +08:00
@0915240 前一阵子看到新闻 Jigsaw 没有通过投票啊.
murmur
2017-06-04 18:56:29 +08:00
java 从来没说用 java1.8 鄙视 java1.6 + apache utils

java 从来没靠语法胜出 靠的是宇宙最强虚拟机+第二强 IDE+最完善开源生态
murmur
2017-06-04 18:58:10 +08:00
@msg7086 所以这个东西除了拿来面试之外,有对应业务的需求么,数学上的矩阵计算也可以
sagaxu
2017-06-04 19:57:18 +08:00
@CRVV C 不是自带了一个 qsort 吗?

@msg7086 我不懂 ruby,但是不到一分钟就 get 到原理了,Java 版的更好懂更好维护吗?
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Print {
private static <T> List<List<T>> tr(List<List<T>> m) {
if (m.isEmpty()) {
return Collections.emptyList();
}

List<List<T>> n = Stream.generate(ArrayList<T>::new).limit(m.get(0).size() - 1).collect(Collectors.toList());
n.forEach(ts -> m.forEach(t -> ts.add(null)));

for (int i = 1; i < m.get(0).size(); i++) {
for (int j = 0; j < m.size(); j++) {
n.get(i - 1).set(m.size() - j - 1, m.get(j).get(i));
}
}
return n;
}

private static <T> String spiral_print(List<List<T>> m) {
if (m.isEmpty()) return "";
StringBuilder b = new StringBuilder();
m.stream().map(chars -> chars.get(0).toString()).forEachOrdered(b::append);
return b.append(spiral_print(tr(m))).toString();
}

public static void main(String[] args) {
{
List<List<Character>> m = new ArrayList<>();
m.add(Arrays.asList('a', 'b', 'c', 'd'));
m.add(Arrays.asList('e', 'f', 'g', 'h'));
m.add(Arrays.asList('i', 'j', 'k', 'l'));

System.out.println(spiral_print(m));
}

{
List<List<Character>> m = new ArrayList<>();
m.add(Arrays.asList('a', 'b', 'c', 'd'));

System.out.println(spiral_print(m));
}
}
}


@tlday 我始终觉得语法糖这事情,因团队而异,一个人的团队,想怎么写都行。两个人或者人更多的时候,最简单的办法就是看这个团队的中位数工资,8K 的团队,跟 30K 的团队,对语言的要求是完全不同的,8K 眼里的难懂的奇淫技巧,在 30K 眼里可能只是稀松平常。都用 Java,8K 的人看 30K 写的代码,很容易看不懂,30K 看 8K 的很容易心情烦躁,都不利于维护。
CRVV
2017-06-04 21:50:31 +08:00
@sagaxu
qsort 和 std::sort 的语义不一样。从结果来说,qsort 比 std::sort 慢得多。这不叫实现了范型的 std::sort
http://www.geeksforgeeks.org/c-qsort-vs-c-sort/
sagaxu
2017-06-04 22:27:11 +08:00
@CRVV 语义是一样的,只是性能不同,qsort 也能用 macro 封装,https://github.com/ahmadsalim/qsort-inline,这样就没有函数调用开销了,多态也可以通过函数指针模拟,内核 VFS 不就这么干的么。
msg7086
2017-06-05 06:54:05 +08:00
@murmur 只是随便举个语言表达能力的例子而已。
业务上有很多类似的东西,比如 select+map+tap 写 oneliner 在我们自己系统的 Ruby codebase 里是很常见的。
相对的至少 Python 和 Java 都是很少很少会写那种 oneline code 的。
@sagaxu 你 Get 到原理是因为有题目做铺垫。
假如没有题目,就给你函数体那一行然后问你这函数是干啥的,你可能会纠结不少时间。

至于这个 Java 代码,看上去像是直接从我 Ruby 代码上翻译的?
你试试看正常写这道题,用 4 个循环,从第一列,最后一行,最后一列到第一行分别拿出字符放进 SB 里,这样写,不要强行去套 transpose。

不过你这最后一段说得很有道理,我很赞同。
sunboy911
2017-06-05 09:39:25 +08:00
大家要搞清楚,谷歌只是承认了 Kotlin 是开发安卓的官方语言之一!!!
araraloren
2017-06-05 10:17:19 +08:00
@sagaxu
语法糖、语法糖,没有语言的支持,C 就算能模拟任何东西,再牛逼也不能这么写
```
template <typename T>
void qsort(T* beg, T* end, int (*f)(T*, T*))
{
# sort
}
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/365710

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX