10 個牛逼的單行代碼編程技巧,你會用嗎?

本文列舉了十個使用一行代碼即可獨立完成(不依賴其他代碼)的業務邏輯,主要依賴的是Java8中的Lambda和Stream等新特性以及try-with-resources、JAXB等。

1、對列表/數組中的每個元素都乘以2

<code>  
 

int

[] ia = 

range

(

1

10

).

map

(i -> i * 

2

).toArray();  List result = 

range

(

1

10

).

map

(i -> i * 

2

).boxed().collect(toList());/<code>

2、計算集合/數組中的數字之和

<code> 

range

(

1

1000

)

.sum

();  

range

(

1

1000

)

.reduce

(

0

Integer

::sum);  

Stream

.iterate

(

0

, i -> i + 

1

)

.limit

(

1000

)

.reduce

(

0

Integer

::sum);  

IntStream

.iterate

(

0

, i -> i + 

1

)

.limit

(

1000

)

.reduce

(

0

Integer

::sum);/<code>

3、驗證字符串是否包含集合中的某一字符串

<code>

final

 List<

String

> keywords = Arrays.asList(

"brown"

"fox"

"dog"

"pangram"

);

final

 

String

 tweet = 

"The quick brown fox jumps over a lazy dog. #pangram http://www.rinkworks.com/words/pangrams.shtml"

; keywords.stream().anyMatch(tweet::contains); keywords.stream().reduce(

false

, (b, keyword) -> b || tweet.contains(keyword), (l, r) -> l || r);/<code>

4、讀取文件內容

原作者認為try with resources也是一種單行代碼編程。

<code>

try

 (BufferedReader reader = 

new

 BufferedReader(

new

 FileReader(

"data.txt"

))) {    

String

 fileText = reader.lines().reduce(

""

String

::concat);  }  

try

 (BufferedReader reader = 

new

 BufferedReader(

new

 FileReader(

"data.txt"

))) {    List<

String

> fileLines = reader.lines().collect(toCollection(LinkedList<

String

>::

new

));  }  

try

 (Stream<

String

> lines = Files.lines(

new

 File(

"data.txt"

).toPath(), Charset.defaultCharset())) {    List<

String

> fileLines = lines.collect(toCollection(LinkedList<

String

>::

new

));  }/<code>

5、輸出歌曲《Happy Birthday to You!》 - 根據集合中不同的元素輸出不同的字符串

<code> 

range

(

1

5

).boxed().

map

(i -> { out.

print

(

"Happy Birthday "

); 

if

 (i == 

3

return

 

"dear NAME"

else

 

return

 

"to You"

; }).forEach(out::

println

);/<code>

6、過濾並分組集合中的數字

<code> 

Map 

List>

 

result

 

=

 

Stream.of(49,

 

58

,

 

76

,

 

82

,

 

88

,

 

90

).collect(groupingBy(forPredicate(i

 

->

 

i

 

>

 

60

,

 

"passed"

,

 

"failed"

)));

/<code>

7、獲取並解析xml協議的Web Service

<code>FeedType feed = JAXB.unmarshal(

new

 URL(

"http://search.twitter.com/search.atom?&q=java8"

), FeedType

.

class

); JAXB.marshal(feed, System.out);/<code>

8、獲得集合中最小/最大的數字

<code> 

int

 

min

 

=

 

Stream.of(14,

 

35

,

 

-7

,

 

46

,

 

98

).reduce(Integer::min).get();

 

min

 

=

 

Stream.of(14,

 

35

,

 

-7

,

 

46

,

 

98

).min(Integer::compare).get();

 

min

 

=

 

Stream.of(14,

 

35

,

 

-7

,

 

46

,

 

98

).mapToInt(Integer::new).min();

 

int

 

max

 

=

 

Stream.of(14,

 

35

,

 

-7

,

 

46

,

 

98

).reduce(Integer::max).get();

 

max

 

=

 

Stream.of(14,

 

35

,

 

-7

,

 

46

,

 

98

).max(Integer::compare).get();

 

max

 

=

 

Stream.of(14,

 

35

,

 

-7

,

 

46

,

 

98

).mapToInt(Integer::new).max();

/<code>

9、並行處理

<code> 

long

 result = dataList.parallelStream().mapToInt(line -> processItem(line)).sum();/<code>

10、集合上的各種查詢(LINQ in Java)

<code>

List

 albums = Arrays.asList(unapologetic, tailgates, red); albums.stream()   .filter(a -> a.tracks.stream().anyMatch(t -> (t.rating >= 

4

)))   .sorted(comparing(album -> album.name))   .

forEach

(album -> System.out.println(album.name));

List

 allTracks = albums.stream()   .flatMap(album -> album.tracks.stream())   .collect(toList()); MapList> tracksByRating = allTracks.stream()   .collect(groupingBy(Track::getRating));/<code>


分享到:


相關文章: