Cộng đồng Java Việt Nam | Java Việt Nam | Java SE, Java EE, Android, Spring Framework

[Java 8] Đọc file text theo từng dòng bằng cách sử dụng Stream

  • 3
  • 0
Chào các bạn, trong bài viết này, chúng ta sẽ cùng tìm hiểu về Cách đọc file text theo từng dòng bằng cách sử dụng Stream trong Java 8

Trong Java 8, bạn có thể sử dụng Files.lines để đọc file bằng Stream.

c://lines.txt – Nội dung file text
Code:
line1
line2
line3
line4
line5
1. Java 8 Read File + Stream
TestReadFile.java
Java:
package com.mkyong.java8;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class TestReadFile {

    public static void main(String args[]) {

        String fileName = "c://lines.txt";

        //read file into stream, try-with-resources
        try (Stream<String> stream = Files.lines(Paths.get(fileName))) {

            stream.forEach(System.out::println);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}
Kết quả
Code:
line1
line2
line3
line4
line5
2. Java 8 Read File + Stream +...

[Java 8] Nối các chuỗi con

  • 4
  • 0
Chào các bạn, trong bài viết này, chúng ta sẽ cùng tìm hiểu về Cách nối các chuỗi con thành chuỗi kết quả trong Java 8

1. StringJoiner
1.1 Nối các chuỗi bằng dấu phân cách

Java:
    StringJoiner sj = new StringJoiner(",");
        sj.add("aaa");
        sj.add("bbb");
        sj.add("ccc");
        String result = sj.toString(); //aaa,bbb,ccc
1.2 Nối các chuỗi bằng dấu phân cách, bắt đầu là một tiền tố và kết thúc với một hậu tố

Java:
    StringJoiner sj = new StringJoiner("/", "prefix-", "-suffix");
        sj.add("2016");
        sj.add("02");
        sj.add("26");
        String result = sj.toString(); //prefix-2016/02/26-suffix
2. String.join
Phương thức tĩnh String.join() sẽ sử dụng String Joiner

2.1 Nối các chuỗi bằng dấu phân cách

Java:
    //2015-10-31
    String result = String.join("-", "2015", "10", "31" );
2.2 Nối các chuỗi trong List bằng dấu phân cách

Java:
...

[Java 8] Tạo số integer ngẫu nhiên trong một phạm vi

  • 10
  • 0
Chào các bạn, trong bài viết này, chúng ta sẽ cùng tìm hiểu về 3 cách để tạo số ngẫu nhiên kiểu integer trong một phạm vi nhất định.

java-random-integer-in-range.jpg

  1. java.util.Random.nextInt
  2. Math.random
  3. java.util.Random.ints (Java 8)
1. java.util.Random
Phương thức Random().nextInt(int bound) sẽ tạo ra số integer x ngẫu nhiên có giá trị trong khoảng từ 0 đến giới hạn của giá trị bound truyền vào (0 <= x < bound)

1.1 Đoạn code này, getRandomNumberInRange(5, 10), sẽ tạo ra số integer trong khoảng 5 và 10

Java:
    private static int getRandomNumberInRange(int min, int max) {

        if (min >= max) {
            throw new IllegalArgumentException("max must be greater than min");
        }

        Random r = new Random();
        return r.nextInt((max - min) + 1) + min;
    }
1.2 (max – min) + 1) + min là gì?

Công thức trên sẽ tạo số x ngẫu nhiên...

[Java 8] Chuyển đổi Map thành List

  • 9
  • 0
Chào các bạn, trong bài viết này, chúng ta sẽ cùng tìm hiểu về cách chuyển đổi Map thành List trong Java 8

Một số ví dụ về chuyển đổi Map thành List

Java:
Map<String, String> map = new HashMap<>();

// Convert all Map keys to a List
List<String> result = new ArrayList(map.keySet());

// Convert all Map values to a List
List<String> result2 = new ArrayList(map.values());
        
// Java 8, Convert all Map keys to a List
List<String> result3 = map.keySet().stream()
    .collect(Collectors.toList());

// Java 8, Convert all Map values  to a List
List<String> result4 = map.values().stream()
    .collect(Collectors.toList());

// Java 8, seem a bit long, but you can enjoy the Stream features like filter and etc. 
List<String> result5 = map.values().stream()
    .filter(x -> !"apple".equalsIgnoreCase(x))
    .collect(Collectors.toList());
       
// Java 8, split a map into 2 List, it works!
// refer example 3 below
1. Chuyển đổi Map thành List
Để...

[Java 8] Tìm hiểu về flatMap

  • 23
  • 0
Chào các bạn, trong bài viết này, chúng ta sẽ cùng tìm hiểu về flatMap trong Java 8

Trong Java 8, Stream có thể giữ nhiều kiểu dữ liệu khác nhau trong nó, ví dụ như:

Java:
Stream<String[]> 

Stream<Set<String>> 

Stream<List<String>> 

Stream<List<Object>>
Thế nhưng, các phép toán trên Stream (filter, sum. Distinct..) và collectors thì không hỗ trợ điều này. Vì thế, chúng ta cần flatMap() để thực hiện các chuyển đổi bên dưới:

Java:
Stream<String[]>        -> flatMap ->    Stream<String>
Stream<Set<String>>    -> flatMap ->    Stream<String>
Stream<List<String>>    -> flatMap ->    Stream<String>
Stream<List<Object>>    -> flatMap ->    Stream<Object>
flatMap hoạt động như thế nào:
Java:
{ {1,2}, {3,4}, {5,6} } -> flatMap -> {1,2,3,4,5,6}

{ {'a','b'}, {'c','d'}, {'e','f'} } -> flatMap -> {'a','b','c','d','e','f'}
1. Stream + String[] + flatMap
1.1 Ví dụ bên dưới sẽ in ra một chuỗi kết quả rỗng, bởi vì filter() không...

[Java 8] Sử dụng stream.filter() để lọc dữ liệu trong Map

  • 15
  • 0
Chào các bạn, trong bài viết này, chúng ta sẽ cùng tìm hiểu về cách lọc (Filter) dữ liệu của 1 Map trong Java 8

Trước Java 8

Java:
    Map<Integer, String> map = new HashMap<>();

    map.put(1, "linode.com");

    map.put(2, "heroku.com");

       

    String result = "";

    for (Map.Entry<Integer, String> entry : map.entrySet()) {

        if("something".equals(entry.getValue())){

            result = entry.getValue();

        }

    }
Với Java 8, chuyển Map.entrySet() vào trong 1 stream, tiếp theo là filter() và collect() nó

Java:
     Map<Integer, String> map = new HashMap<>();
    map.put(1, "linode.com");
    map.put(2, "heroku.com");
   
    //Map -> Stream -> Filter -> String
    String result = map.entrySet().stream()
        .filter(x -> "something".equals(x.getValue()))
        .map(x->x.getValue())
        .collect(Collectors.joining());

    //Map -> Stream -> Filter -> MAP
    Map<Integer, String> collect = map.entrySet().stream()...

[Java 8] Chuyển đổi List thành Map

  • 23
  • 0
Chào các bạn, trong bài viết này, chúng ta sẽ cùng tìm hiểu về cách chuyển List thành Map trong Java 8

Một số ví dụ về làm thế nào để chuyển đổi từ một List của môt Object sang một Map và làm thế nào để xử lý khóa trùng.

Hosting.java
Java:
package com.mkyong.java8

public class Hosting {

    private int Id;
    private String name;
    private long websites;

    public Hosting(int id, String name, long websites) {
        Id = id;
        this.name = name;
        this.websites = websites;
    }

    //getters, setters and toString()
}
1. Chuyển List thành Map với Collectors.toMap()
Tạo một List các đối tượng Hosting, và sử dụng Collectors.toMap để chuyển nó sang Map.

TestListMap.java
Java:
package com.mkyong.java8

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class TestListMap {

    public static void main(String[] args) {

        List<Hosting> list = new...

[Java 8] Sắp xếp các phần từ của Map

  • 14
  • 0
Chào các bạn, trong bài viết này, chúng ta sẽ cùng tìm hiểu về cách sắp xếp các phần từ của Map trong Java 8

Ví dụ về cách sử dụng Stream để sắp xếp các phần tử của Map theo khóa (key) hoặc giá trị (value) trong Java 8

1. Giải thích nhanh
Các bước để sắp xếp các phần tử của Map trong Java 8
  1. Chuyển đổi một Map thành một Stream
  2. Sắp xếp Map đó
  3. Tập hợp và trả kết quả về một LinkedHashMap mới(giữ đúng thứ tự).

Java:
Map result = map.entrySet().stream()
    .sorted(Map.Entry.comparingByKey())          
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
    (oldValue, newValue) -> oldValue, LinkedHashMap::new));
Lưu ý : Collectors.toMap sẽ trả về là HasMap.

2. Sắp xếp bằng khóa (Key)

SortByKeyExample.java
Java:
package com.mkyong.test;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.stream.Collectors;

public class...

[Java 8] – Lỗi Stream has already been operated upon or closed

  • 18
  • 0
Chào các bạn, trong bài viết này, chúng ta sẽ cùng tìm hiểu về cách tái sử dụng Stream trong Java 8

Trong Java 8, không thể sử tái dụng Stream, nói cách khác, Stream sẽ được đóng sau khi sử dụng xong.

1. Ví dụ về Stream bị đóng!

Theo dõi ví dụ, sẽ thấy được chương trình quăng ra lỗi IllegalStateException

TestJava8.java
Java:
package com.mkyong.java8;

import java.util.Arrays;
import java.util.stream.Stream;

public class TestJava8 {

    public static void main(String[] args) {

        String[] array = {"a", "b", "c", "d", "e"};
        Stream<String> stream = Arrays.stream(array);

        // loop a stream
        stream.forEach(x -> System.out.println(x));

        // reuse it to filter again! throws IllegalStateException
        long count = stream.filter(x -> "b".equals(x)).count();
        System.out.println(count);

    }
}
Kết quả
Code:
java.lang.IllegalStateException: stream has already been operated upon or closed
    at...

[Java 8] Chuyển đổi mảng thành Stream

  • 16
  • 0
Chào các bạn, trong bài viết này, chúng ta sẽ cùng tìm hiểu về cách chuyển mảng thành Stream trong Java 8

Trong Java 8, có thể sử dụng Arrays.stream hoặc Stream.of để chuyển Array thành Stream

1. Mảng các đối tượng (Object Arrays)
Với mảng đối tượng, Arrays.stream và Stream.of đều trả về kết quả giống nhau

TestJava8.java
Java:
package com.mkyong.java8;

import java.util.Arrays;
import java.util.stream.Stream;

public class TestJava8 {

    public static void main(String[] args) {

        String[] array = {"a", "b", "c", "d", "e"};

        //Arrays.stream
        Stream<String> stream1 = Arrays.stream(array);
        stream1.forEach(x -> System.out.println(x));

        //Stream.of
        Stream<String> stream2 = Stream.of(array);
        stream2.forEach(x -> System.out.println(x));
    }

}
Kết quả
Code:
a
b
c
d
e
a
b
c
d
e
Mã nguồn JDK

Arrays.java
Java:
   /**
     * Returns a sequential {@link Stream} with the specified...

[Java 8] Chuyển đổi Stream sang List

  • 15
  • 0
Chào các bạn, trong bài viết này, chúng ta sẽ cùng tìm hiểu về cách chuyển Stream sang List trong Java 8

Java8Example1.java
Java:
package com.mkyong.java8;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Java8Example1 {

    public static void main(String[] args) {

        Stream<String> language = Stream.of("java", "python", "node");

        //Convert a Stream to List
        List<String> result = language.collect(Collectors.toList());

        result.forEach(System.out::println);

    }
}
Kết quả
Code:
java
python
node
Một ví dụ khác, lọc số khác 3 và chuyển đổi nó thành List

Java8Example2.java
Java:
package com.mkyong.java8;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Java8Example2 {

    public static void main(String[] args) {

        Stream<Integer> number = Stream.of(1, 2, 3, 4, 5);

        List<Integer> result2 =...

[Java 8] Loại bỏ các giá trị null trong Stream

  • 12
  • 0
Chào các bạn, trong bài viết này, chúng ta sẽ cùng tìm hiểu về cách loại bỏ các giá trị null trong Stream

Ví dụ về một Stream có chứa các giá trị null

Java8Examples.java
Java:
package com.mkyong.java8;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Java8Examples {

    public static void main(String[] args) {

        Stream<String> language = Stream.of("java", "python", "node", null, "ruby", null, "php");

        List<String> result = language.collect(Collectors.toList());

        result.forEach(System.out::println);

    }
}
Kết quả
Code:
java
python
node
null   // <--- NULL
ruby
null   // <--- NULL
php
Giải pháp
Để giải quyết vấn đề này, ta sử dụng Stream.filter(x -> x!=null)

Java8Examples.java
Java:
package com.mkyong.java8;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Java8Examples {

    public static void...

[Java 8] Phân nhóm dữ liệu bằng Stream Collectors groupingBy

  • 17
  • 0
Chào các bạn, trong bài viết này, chúng ta sẽ cùng tìm hiểu về cách sử dụng Stream Collectors để phân nhóm, đếm số lượng, tính tổng và sắp xếp 1 List trong Java 8

1. Phân nhóm, Đếm số lượng và Sắp xếp
1.1 Phân nhóm các phần tử cùng loại trong List và hiển thị số lượng của chúng

Java8Example1.java
Java:
package com.mkyong.java8;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class Java8Example1 {

    public static void main(String[] args) {
       
        //3 apple, 2 banana, others 1
        List<String> items =
                Arrays.asList("apple", "apple", "banana",
                        "apple", "orange", "banana", "papaya");

        Map<String, Long> result =
                items.stream().collect(
                        Collectors.groupingBy(
                                Function.identity(), Collectors.counting()...

[Java 8] Chuyển đổi thông tin bằng Streams map()

  • 16
  • 0
Chào các bạn, trong bài viết này, chúng ta sẽ cùng tìm hiểu về Streams map trong Java 8

Trong Java 8, có thể sử dụng stream().map() để convert 1 object thành nhiều thông tin khác nhau.

1. Chuyển List String sang chữ in hoa
1.1 Ví dụ đơn giản về chuyển List các String sang chữ in hoa.

TestJava8.java
Java:
package com.mkyong.java8;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class TestJava8 {

    public static void main(String[] args) {

        List<String> alpha = Arrays.asList("a", "b", "c", "d");

        //Before Java8
        List<String> alphaUpper = new ArrayList<>();
        for (String s : alpha) {
            alphaUpper.add(s.toUpperCase());
        }

        System.out.println(alpha); //[a, b, c, d]
        System.out.println(alphaUpper); //[A, B, C, D]

        // Java 8
        List<String> collect =...

[Java 8] Sử dụng Streams filter để lọc dữ liệu

  • 42
  • 4
Chào các bạn, hôm nay chúng ta sẽ cùng tìm hiểu về Java 8 Streams filter(), collect(), findAny() and orElse()

1. Streams filter() và collect()
1.1 Trước Java 8, lọc các phần tử trong List như sau

BeforeJava8.java
Java:
package com.mkyong.java8;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class BeforeJava8 {

    public static void main(String[] args) {

        List<String> lines = Arrays.asList("spring", "node", "mkyong");
        List<String> result = getFilterOutput(lines, "mkyong");
        for (String temp : result) {
            System.out.println(temp);    //output : spring, node
        }

    }

    private static List<String> getFilterOutput(List<String> lines, String filter) {
        List<String> result = new ArrayList<>();
        for (String line : lines) {
            if (!"mkyong".equals(line)) { // we dont like mkyong
                result.add(line);
            }
        }
        return...

[Java 8] Duyệt List bằng lệnh forEach

  • 15
  • 0
Chào các bạn, hôm nay chúng ta sẽ cùng tìm hiểu về cách duyệt List và Map bằng cách sử dụng cú pháp forEach trong Java 8

1. forEach với Map
1.1 Cách duyệt Map thông thường
Java:
Map<String, Integer> items = new HashMap<>();
items.put("A", 10);
items.put("B", 20);
items.put("C", 30);
items.put("D", 40);
items.put("E", 50);
items.put("F", 60);

for (Map.Entry<String, Integer> entry : items.entrySet()) {
    System.out.println("Item : " + entry.getKey() + " Count : " + entry.getValue());
}
1.2 Trong Java 8, có thể sử dụng cú pháp forEach + biểu thức lambda để duyệt Map
Java:
Map<String, Integer> items = new HashMap<>();
items.put("A", 10);
items.put("B", 20);
items.put("C", 30);
items.put("D", 40);
items.put("E", 50);
items.put("F", 60);

items.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v));

items.forEach((k,v)->{
    System.out.println("Item : " + k + " Count : " + v);
    if("E".equals(k)){...

[Java 8] Sử dụng Lambda-Comparator để sắp xếp List

  • 17
  • 0
Chào các bạn, hôm nay chúng ta sẽ cùng tìm hiểu về cách sử dụng biểu thức Lambda trong Java 8 để tạo ra 1 Comparator và sử dụng nó cho việc sắp xếp danh sách

1. Ví dụ về Comparator đơn giản
Java:
Comparator<Developer> byName = new Comparator<Developer>() {
        @Override
        public int compare(Developer o1, Developer o2) {
            return o1.getName().compareTo(o2.getName());
        }
    };
2. Biểu thức Lambda tương đương
Java:
Comparator<Developer> byName =
        (Developer o1, Developer o2)->o1.getName().compareTo(o2.getName());
1. Sắp xếp không sử dụng Lambda
Ví dụ về so sách 2 đối tượng thuộc class Developer dựa vào thông tin tuổi. Bình thường, ta sử dụng Collections.sort và 1 anonymous Comparator class để thực hiện
Java:
package com.mkyong.java8;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class...

[Java 8] Tính số ngày giữa 2 mốc thời gian

  • 16
  • 0
Chào các bạn, hôm nay chúng ta sẽ cùng tìm hiểu và cách tính số ngày giữa 2 mốc thời gian trong java 8.

Trong java 8, có thể sử dụng ChronoUnit.DAYS.between(from, to) để tính số ngày giữa 2 mốc thời điểm.

LocalDate
JavaBetweenDays1.java
Java:
package com.mkyong.java8;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

public class JavaBetweenDays1 {

    public static void main(String[] args) {

        LocalDate from = LocalDate.now();
        LocalDate to = from.plusDays(10);

        long result = ChronoUnit.DAYS.between(from, to);
        System.out.println(result);

    }
}
Kết quả
Code:
10
LocalDateTime
JavaBetweenDays2.java
Java:
package com.mkyong.java8;

import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;

public class JavaBetweenDays2 {

    public static void main(String[] args) {

        LocalDateTime from = LocalDateTime.now();
        LocalDateTime to = from.plusDays(10)...

Spring Interceptor

  • 24
  • 0
Chào các bạn, hôm nay chúng ta sẽ cùng tìm hiểu về Spring MVC Interceptor

- Trong Spring MVC hỗ trợ 1 tính năng khá giống với Filter trong JSP-Server đó là Interceptor.

- Interceptor thực hiện lọc các request được xử lý bởi controller.

- Mỗi request gửi đến 1 URL được xử lý bởi controller có thể đi qua không, một hoặc nhiều Interceptor.

- Interceptor sẽ kiểm tra thông tin request (thông tin đăng nhập, session, ip…) để cho phép request đi qua hoặc từ chối request, chuyển hướng request

spring-interceptor.jpg

Code ví dụ
spring-interceptor-1.jpg

File cấu hình
pom.xml
XML:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>stackjava.com</groupId>...

Thao tác với các file resource trong project Spring MVC

  • 23
  • 0
Chào các bạn, hôm nay chúng ta sẽ cùng tìm hiểu về cách thao tác với file resource trong 1 project Spring MVC

- Trong Spring MVC nói riêng và java nói chung, ta thường sử dụng class File để thao tác với file. Tuy nhiên, đối với project Spring MVC, khi mới deploy lên server, ta thường build nó thành file war, do đó các file resource cũng sẽ được đóng gói bên trong file war này. Không thể sử dụng class File để thao tác với các file nằm bên trong file war.
- Thật may, Spring framework cung cấp cho chúng ta class ClassPathResource để chúng ta thao tác với các file resource bên trong file war
Java:
package vn.hcm.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping
public class MainController {

    @GetMapping
    public String index() {
        File file;
        ClassPathResource classPathResource;

        // Doc file...