JavaRush /Blog Jawa /Random-JV /Ngopi #155. Top 10 Fungsi ing Jawa

Ngopi #155. Top 10 Fungsi ing Jawa

Diterbitake ing grup

Top 10 Fungsi ing Jawa

Sumber: DZone Artikel iki nyathet sepuluh fitur pemrograman Java sing asring digunakake dening pangembang ing karya saben dinane. Ngopi #155.  Top 10 fungsi ing Jawa - 1

1. Metode Pabrik Koleksi

Koleksi minangka salah sawijining fitur sing paling umum digunakake ing pemrograman. Iki digunakake minangka wadhah kanggo nyimpen obyek lan diterusake. Koleksi uga digunakake kanggo ngurutake, nggoleki, lan mbaleni obyek, nggawe urip programmer luwih gampang. Dheweke duwe sawetara antarmuka dhasar kayata List, Set, Map, uga sawetara implementasine. Cara tradisional kanggo nggawe Koleksi lan Peta bisa katon verbose kanggo akeh pangembang. Mulane Java 9 ngenalake sawetara cara pabrik sing ringkes. Daftar :
List countries = List.of("Bangladesh", "Canada", "United States", "Tuvalu");
Set :
Set countries = Set.of("Bangladesh", "Canada", "United States", "Tuvalu");
Peta :
Map countriesByPopulation = Map.of("Bangladesh", 164_689_383,
                                                            "Canada", 37_742_154,
                                                            "United States", 331_002_651,
                                                            "Tuvalu", 11_792);
Cara pabrik migunani banget nalika kita pengin nggawe wadhah sing ora bisa diganti. Nanging yen sampeyan arep nggawe koleksi mutable, dianjurake kanggo nggunakake pendekatan tradisional.

2. Inferensi Tipe Lokal

Java 10 nambah inferensi jinis kanggo variabel lokal. Sadurunge iki, pangembang kudu nemtokake jinis kaping pindho nalika ngumumake lan miwiti obyek. Iku banget kesel. Deleng conto ing ngisor iki:
Map> properties = new HashMap<>();
Jinis informasi ing loro-lorone dituduhake ing kene. Yen kita nemtokake ing sak panggonan, maca kode lan compiler Jawa bakal gampang ngerti sing iku kudu jinis Peta. Inferensi jinis lokal mung ditindakake. Iki contone:
var properties = new HashMap>();
Saiki kabeh ditulis mung sapisan lan kode kasebut ora katon luwih elek. Lan nalika kita nelpon cara lan nyimpen asil ing variabel, kode dadi luwih cendhek. Tuladha:
var properties = getProperties();
Lan luwih:
var countries = Set.of("Bangladesh", "Canada", "United States", "Tuvalu");
Senajan inferensi jinis lokal katon kaya fitur sing trep, sawetara wong ngritik. Sawetara pangembang mbantah manawa iki nyuda keterbacaan. Lan iki luwih penting tinimbang ringkesan.

3. Ekspresi Ngalih Lanjut

Pernyataan switch tradisional wis ana ing Jawa wiwit wiwitan lan kaya C lan C ++ nalika iku. Iki apik, nanging nalika basa berkembang, operator iki ora menehi dandan nganti Jawa 14. Mesthi wae, ana sawetara kekurangan. Paling kondhang ana tiba -liwat: Kanggo ngatasi masalah iki, gawe digunakake break statements, kang umumé kode boilerplate. Nanging, Java 14 ngenalake versi sing luwih apik saka statement switch kanthi dhaptar fungsi sing luwih gedhe. Saiki kita ora perlu maneh nambah statement break lan iki solves masalah gagal. Kajaba iku, statement switch bisa ngasilake nilai, tegese kita bisa nggunakake minangka ekspresi lan nemtokake menyang variabel.
int day = 5;
String result = switch (day) {
    case 1, 2, 3, 4, 5 -> "Weekday";
    case 6, 7 -> "Weekend";
    default -> "Unexpected value: " + day;
};

4. Cathetan

Senajan Records minangka fitur sing relatif anyar sing dikenalake ing Java 16, akeh pangembang nemokake iku migunani banget, utamane amarga nggawe obyek sing ora bisa diganti. Asring kita butuh obyek data ing program kita kanggo nyimpen utawa ngirim nilai saka siji metode menyang liyane. Contone, kelas kanggo nransfer koordinat x, y lan z, sing bakal ditulis kaya ing ngisor iki:
package ca.bazlur.playground;

import java.util.Objects;

public final class Point {
    private final int x;
    private final int y;
    private final int z;

    public Point(int x, int y, int z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }

    public int x() {
        return x;
    }

    public int y() {
        return y;
    }

    public int z() {
        return z;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == this) return true;
        if (obj == null || obj.getClass() != this.getClass()) return false;
        var that = (Point) obj;
        return this.x == that.x &&
                this.y == that.y &&
                this.z == that.z;
    }

    @Override
    public int hashCode() {
        return Objects.hash(x, y, z);
    }

    @Override
    public String toString() {
        return "Point[" +
                "x=" + x + ", " +
                "y=" + y + ", " +
                "z=" + z + ']';
    }

}
Kelas katon banget verbose. Kanthi bantuan entri, kabeh kode iki bisa diganti karo versi sing luwih ringkes:
package ca.bazlur.playground;

public record Point(int x, int y, int z) {
}

5. Opsional

Cara minangka kontrak ing ngendi kita nemtokake kahanan. Kita nemtokake paramèter kanthi jinis, uga jinis bali. Banjur kita ngarepake yen metode kasebut diarani, bakal tumindak miturut kontrak. Nanging, asring kita mungkasi kanthi null saka cara tinimbang nilai saka jinis sing ditemtokake. Iki salah. Kanggo mutusake masalah iki, inisiator biasane nguji nilai kasebut kanthi kondisi yen, preduli yen nilai kasebut nol utawa ora. Tuladha:
public class Playground {

    public static void main(String[] args) {
        String name = findName();
        if (name != null) {
            System.out.println("Length of the name : " + name.length());
        }
    }

    public static String findName() {
        return null;
    }
}
Deleng kode ing ndhuwur. Cara findName mesthine ngasilake String , nanging null. Inisiator saiki kudu mriksa nulls dhisik kanggo ngatasi masalah kasebut. Yen inisiator lali nindakake iki, mula kita bakal entuk NullPointerException . Ing sisih liya, yen tandha cara nuduhake kemungkinan ora bali, mula iki bakal ngrampungake kabeh kebingungan. Lan ing kene Opsional bisa nulungi kita .
import java.util.Optional;

public class Playground {

    public static void main(String[] args) {
        Optional optionalName = findName();
        optionalName.ifPresent(name -> {
            System.out.println("Length of the name : " + name.length());
        });
    }

    public static Optional findName() {
        return Optional.empty();
    }
}
Ing kene kita wis nulis maneh metode findName kanthi opsi Opsional supaya ora ngasilake nilai apa wae. Iki menehi tandha programer luwih dhisik lan ndandani masalah kasebut.

6. Java Tanggal Wektu API

Saben pangembang bingung siji gelar utawa liyane kanthi ngitung tanggal lan wektu. Iki ora exaggeration. Iki utamane amarga ora ana API Java sing apik kanggo nggarap tanggal lan wektu. Saiki masalah iki ora cocog maneh, amarga Java 8 ngenalake set API sing apik banget ing paket java.time, sing ngrampungake kabeh masalah sing ana gandhengane karo tanggal lan wektu. Paket java.time wis akeh antarmuka lan kelas sing ngilangi paling masalah, kalebu zona wektu. Kelas sing paling umum digunakake ing paket iki yaiku:
  • LocalDate
  • Wektu Lokal
  • LocalDateTime
  • Duration
  • Periode
  • ZonedDateTime
Conto nggunakake kelas saka paket java.time:
import java.time.LocalDate;
import java.time.Month;

public class Playground3 {
    public static void main(String[] args) {
        LocalDate date = LocalDate.of(2022, Month.APRIL, 4);
        System.out.println("year = " + date.getYear());
        System.out.println("month = " + date.getMonth());
        System.out.println("DayOfMonth = " + date.getDayOfMonth());
        System.out.println("DayOfWeek = " + date.getDayOfWeek());
        System.out.println("isLeapYear = " + date.isLeapYear());
    }
}
Conto nggunakake kelas LocalTime kanggo ngetung wektu:
LocalTime time = LocalTime.of(20, 30);
int hour = time.getHour();
int minute = time.getMinute();
time = time.withSecond(6);
time = time.plusMinutes(3);
Nambah zona wektu:
ZoneId zone = ZoneId.of("Canada/Eastern");
LocalDate localDate = LocalDate.of(2022, Month.APRIL, 4);
ZonedDateTime zonedDateTime = date.atStartOfDay(zone);

7.NullPointerException

Saben pangembang sengit marang NullPointerException. Bisa dadi angel banget nalika StackTrace ora menehi informasi sing migunani babagan apa masalahe. Kanggo nduduhake iki, ayo deleng kode sampel:
package com.bazlur;

public class Main {

    public static void main(String[] args) {
        User user = null;
        getLengthOfUsersName(user);
    }

    public static void getLengthOfUsersName(User user) {
        System.out.println("Length of first name: " + user.getName().getFirstName());
    }
}

class User {
    private Name name;
    private String email;

    public User(Name name, String email) {
        this.name = name;
        this.email = email;
    }

   //getter
   //setter
}

class Name {
    private String firstName;
    private String lastName;

    public Name(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

   //getter
   //setter
}
Deleng cara dhasar ing wacana iki. Kita weruh yen NullPointerException bakal dibuwang sabanjure . Yen kita mbukak lan ngumpulake kode ing versi sadurunge Java 14, kita bakal entuk StackTrace ing ngisor iki:
Exception in thread "main" java.lang.NullPointerException
at com.bazlur.Main.getLengthOfUsersName(Main.java:11)
at com.bazlur.Main.main(Main.java:7)
Ana sethithik banget informasi ing kene babagan ngendi lan ngapa NullPointerException dumadi . Nanging ing Java 14 lan versi mengko, kita entuk informasi luwih akeh ing StackTrace, sing trep banget. Ing Jawa 14 kita bakal weruh:
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "ca.bazlur.playground.User.getName()" because "user" is null
at ca.bazlur.playground.Main.getLengthOfUsersName(Main.java:12)
at ca.bazlur.playground.Main.main(Main.java:8)

8. CompletableFuture

Kita nulis program baris dening baris, lan padha biasane kaleksanan baris dening baris. Nanging ana wektu nalika kita mbutuhake eksekusi paralel kanggo nggawe program luwih cepet. Kanggo iki biasane nggunakake Java Thread. Pemrograman thread Java ora mesthi babagan program paralel. Nanging, menehi kita kemampuan kanggo nyipta sawetara modul program independen sing bakal dieksekusi kanthi mandiri lan asring uga ora sinkron. Nanging, program thread cukup angel, utamane kanggo pamula. Mulane Java 8 nawakake API sing luwih prasaja sing ngidini sampeyan nglakokake bagean saka program kanthi ora sinkron. Ayo padha ndeleng conto. Ayo kita kudu nelpon telung REST API banjur gabungke asil. Kita bisa nelpon siji-siji. Yen saben wong butuh udakara 200 milidetik, banjur total wektu nampa 600 milidetik. Apa yen kita bisa mbukak ing podo karo? Wiwit prosesor modern biasane multi-inti, padha bisa gampang nangani telung telpon liyane ing telung prosesor beda. Nggunakake CompletableFuture kita bisa nindakake iki kanthi gampang.
package ca.bazlur.playground;

import java.time.Duration;
import java.time.Instant;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

public class SocialMediaService {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        var service = new SocialMediaService();

        var start = Instant.now();
        var posts = service.fetchAllPost().get();
        var duration = Duration.between(start, Instant.now());

        System.out.println("Total time taken: " + duration.toMillis());
    }

    public CompletableFuture> fetchAllPost() {
        var facebook = CompletableFuture.supplyAsync(this::fetchPostFromFacebook);
        var linkedIn = CompletableFuture.supplyAsync(this::fetchPostFromLinkedIn);
        var twitter = CompletableFuture.supplyAsync(this::fetchPostFromTwitter);

        var futures = List.of(facebook, linkedIn, twitter);

        return CompletableFuture.allOf(futures.toArray(futures.toArray(new CompletableFuture[0])))
                .thenApply(future -> futures.stream()
                        .map(CompletableFuture::join)
                        .toList());
    }
    private String fetchPostFromTwitter() {
        sleep(200);
        return "Twitter";
    }

    private String fetchPostFromLinkedIn() {
        sleep(200);
        return "LinkedIn";
    }

    private String fetchPostFromFacebook() {
        sleep(200);
        return "Facebook";
    }

    private void sleep(int millis) {
        try {
            TimeUnit.MILLISECONDS.sleep(millis);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

9. Lambda Expressions

Ekspresi Lambda mbok menawa fitur paling kuat ing basa Jawa. Padha ngganti cara kita nulis kode. Ekspresi lambda kaya fungsi anonim sing bisa njupuk argumen lan ngasilake nilai. Kita bisa nemtokake fungsi kanggo variabel lan pass minangka bantahan kanggo cara, lan cara bisa bali. Dheweke duwe awak. Bentenipun mung saka cara iku ora ana jeneng. Ekspresi cekak lan ringkes. Biasane ora ngemot akeh kode boilerplate. Ayo dadi ndeleng conto ngendi kita kudu dhaptar kabeh file ing direktori karo extension .java.
var directory = new File("./src/main/java/ca/bazlur/playground");
String[] list = directory.list(new FilenameFilter() {
    @Override
    public boolean accept(File dir, String name) {
        return name.endsWith(".java");
    }
});
Yen katon rapet ing Piece saka kode iki, kita wis liwati dhaftar kelas utama anonim () kanggo cara . Lan ing kelas batin kita nyelehake logika kanggo nyaring file. Ateges, kita kasengsem ing bagean logika iki, dudu pola ing sekitar logika. Ekspresi lambda ngidini kita mbusak kabeh cithakan lan kita bisa nulis kode sing menarik kanggo kita. Iki contone:
var directory = new File("./src/main/java/ca/bazlur/playground");
String[] list = directory.list((dir, name) -> name.endsWith(".java"));
Mesthi, iki mung salah sawijining conto; ekspresi lambda duwe akeh keuntungan liyane.

10. Stream API

Ing karya saben dina, salah sawijining tugas umum yaiku ngolah set data. Nduwe sawetara operasi umum kayata nyaring, ngowahi, lan ngempalaken asil. Sadurunge Java 8, operasi kasebut pancen penting. Kita kudu nulis kode kanggo maksud kita (yaiku, apa sing dikarepake) lan kepiye carane. Kanthi panemuan ekspresi lambda lan Stream API, saiki kita bisa nulis fungsi pangolahan data kanthi deklaratif. Kita mung nuduhake niat, lan kita ora perlu nulis carane entuk asil. Ing ngisor iki conto: Kita duwe dhaptar buku lan kita pengin nemokake kabeh jeneng buku Jawa, dipisahake nganggo koma lan diurutake.
public static String getJavaBooks(List books) {
    return books.stream()
            .filter(book -> Objects.equals(book.language(), "Java"))
            .sorted(Comparator.comparing(Book::price))
            .map(Book::name)
            .collect(Collectors.joining(", "));
}
Kode ing ndhuwur iku prasaja, bisa diwaca lan ringkes. Nanging ing ngisor iki sampeyan bisa ndeleng kode imperatif alternatif:
public static String getJavaBooksImperatively(List books) {
    var filteredBook = new ArrayList();
    for (Book book : books) {
        if (Objects.equals(book.language(), "Java")){
            filteredBook.add(book);
        }
    }
    filteredBook.sort(new Comparator() {
        @Override
        public int compare(Book o1, Book o2) {
            return Integer.compare(o1.price(), o2.price());
        }
    });

    var joiner = new StringJoiner(",");
    for (Book book : filteredBook) {
        joiner.add(book.name());
    }

    return joiner.toString();
}
Sanajan cara loro kasebut ngasilake nilai sing padha, kita bisa ndeleng kanthi jelas bedane.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION