国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

從頭學(xué)Java17-今天的Kotlin更香嗎

這篇具有很好參考價值的文章主要介紹了從頭學(xué)Java17-今天的Kotlin更香嗎。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

出于各種限制,很多公司依然停留在Java8,部分小伙伴轉(zhuǎn)向了Kotlin。Kotlin作為靜態(tài)編譯語言,提供大量語法糖,而且編譯后的字節(jié)碼跟Java一致。

當(dāng)時,Java8于2014年發(fā)布,Kotlin于2016年,很多宣稱的語法糖都是對比的Java8。不禁要問,相對今天的Java17,Kotlin優(yōu)勢還在嗎?

現(xiàn)在就用最新的Kotlin1.9.0,對前三篇文章里的lambda、StreamAPI依次改造,實踐出真知!

編寫lambda、調(diào)用

Java

import Java.util.*;
import Java.util.function.*;

/**
 *
 * @author 燒哥burn.red
 */
public class Test1 {
    
    public static void main(String[] args) {
        
        Predicate<String> predicate = s -> s.length() == 3;
        Consumer<String> consumer = s -> System.out.println(s);
        Supplier<String> supplier = () -> "Hello Duke!";
        Function<String, Integer> function = s -> s.length();
        
        IntSupplier intSupplier = () -> 1;
        IntConsumer intConsumer = s -> System.out.println(s);
        IntPredicate intPredicate = i -> i > 10;
        ToIntFunction<String> toIntFunction = s -> s.length();
        UnaryOperator<String> unaryOperator = s -> s.toUpperCase();
        
        BiConsumer<String, Integer> biConsumer = (s, number) -> s.indexOf(number);
        ObjIntConsumer<String> objIntConsumer = (s, value) -> System.out.printf("%s,%d\n", s, value);
        BiPredicate<String, Integer> biPredicate = (word, length) -> word.length() == length;
        BiFunction<String, String, Integer> biFunction = (word, sentence) -> sentence.indexOf(word);
        ToIntBiFunction<String, String> toIntBiFunction = (word, sentence) -> sentence.indexOf(word);
        
        String a = "aaa";
        
        if (predicate.test(a)) {
            consumer.accept(a);
            supplier.get();
            function.apply(a);
            
            intConsumer.accept(1);
            intSupplier.getAsInt();
            intPredicate.test(11);
            toIntFunction.applyAsInt(a);
            unaryOperator.apply(a);
            
            biConsumer.accept(a, 2);
            objIntConsumer.accept(null, 1);
            biPredicate.test(a, 3);
            biFunction.apply("fdsa", a);
            toIntBiFunction.applyAsInt("fdsa", a);
        }
        List<String> strings = new ArrayList<>(List.of("a", "bb", "ccc"));
        strings.forEach(consumer);
        strings.removeIf(predicate);//不應(yīng)該在不可變集合上調(diào)用
        System.out.println(strings);
        
        strings = Arrays.asList("a", "bb", "ccc");
        strings.replaceAll(unaryOperator);
        System.out.println(strings);

//        int i = 0;
//        Consumer<Integer> add = s -> i++;//報錯,從lambda 表達(dá)式引用的本地變量必須是最終變量或?qū)嶋H上的最終變量
    }
}

Kotlin

/**
 *
 * @author 燒哥burn.red
 */

fun main() {
    val predicate = { s: String -> s.length == 3 }
    val consumer = { s: String? -> println(s) }
    val supplier = { "Hello Duke!" }
    val function = { s: String -> s.length }

    val intSupplier = { 1 }
    val intConsumer = { s: Int -> println(s) }
    val intPredicate = { i: Int -> i > 10 }
    val toIntFunction = { s: String -> s.length }
    val unaryOperator = { s: String -> s.uppercase() }

    val biConsumer = { s: String, number: Int -> s.indexOf(number.toChar()) }
    val objIntConsumer = { s: String?, value: Int -> println("$s,$value") }
    val biPredicate = { word: String, length: Int -> word.length == length }
    val biFunction = { word: String?, sentence: String -> sentence.indexOf(word!!) }
    val toIntBiFunction = { word: String?, sentence: String -> sentence.indexOf(word!!) }

    val a = "aaa"

    if (predicate(a)) {
        consumer(a)
        supplier()
        function(a)

        intConsumer(1)
        intSupplier()
        intPredicate(11)
        toIntFunction(a)
        unaryOperator(a)

        biConsumer(a, 2)
        objIntConsumer(null, 1)
        biPredicate(a, 3)
        biFunction("fdsa", a)
        toIntBiFunction("fdsa", a)
    }
    var strings = mutableListOf("a", "bb", "ccc")
    strings.forEach(consumer)
    strings.removeIf(predicate) //不應(yīng)該在不可變集合上調(diào)用
    println(strings)

    strings = arrayListOf("a", "bb", "ccc")
    strings.replaceAll(unaryOperator)
    println(strings)

    var i = 0
    val add = { s: Int? -> i++ } //不報錯
    add(i)
    println(i)
}

可以看出:

  • Kotlin的lambda,沒有那四種劃分,調(diào)用時類似函數(shù),(參數(shù)..),非常簡潔
  • Kotlin的lambda,可以改變外層變量的值
  • Kotlin沒有自己的removeIf,replaceAll,但可以直接調(diào)用Java的
  • Java為原始類型準(zhǔn)備了特別版,Kotlin默認(rèn)都是原始類型
  • Kotlin變量默認(rèn)都是非null

這一局,Kotlin勝出。

方法引用、鏈接

Java

import red.burn.bean.User;

import Java.util.*;
import Java.util.function.*;
import Java.util.logging.Logger;

/**
 * @author 燒哥burn.red
 */
public class Test2 {

    public static void main(String[] args) {
        //方法引用
        DoubleUnaryOperator sqrt = Math::sqrt;
        IntBinaryOperator max = Integer::max;//靜態(tài)方法引用
        Supplier<List<String>> newListOfStrings = ArrayList::new;//構(gòu)造方法引用
        Consumer<String> printer = System.out::println;//綁定到System.out
        Function<String, Integer> toLength = String::length;//非綁定,綁定到String的實例

        //Lambla的鏈接
        Predicate<String> isNull = Objects::isNull;
        Predicate<String> isEmpty = String::isEmpty;
        Predicate<String> isNullOrEmpty = isNull.or(isEmpty);
        Predicate<String> isNotNullNorEmpty = isNullOrEmpty.negate();
        Predicate<String> shorterThan5 = s -> s.length() < 5;
        Predicate<String> p = isNotNullNorEmpty.and(shorterThan5);

        Logger logger = Logger.getLogger("MyApplicationLogger");
        Consumer<String> log = logger::info;
        Consumer<String> printStr = System.out::println;
        Consumer<String> printAndLog = log.andThen(printStr);//
        printAndLog.accept("test");

        Function<String, Integer> function1 = String::length;
        Function<Integer, Integer> function2 = s -> ++s;
        Function<String, Integer> function = function1.andThen(function2);
        System.out.println("new=" + function.apply("abc")); //4

        Function<String, String> id = Function.identity();

        //Comparator
        Comparator<Integer> comparator = Integer::compare;
        Comparator<String> comparator1 = (s1, s2) -> Integer.compare(s1.length(), s2.length());
        Comparator<String> comparator2 = (s1, s2) -> Integer.compare(toLength.apply(s1), toLength.apply(s2));
        Comparator<String> comparator3 = Comparator.comparing(String::length);

        Comparator<User> byFirstName = Comparator.comparing(User::getFirstName);
        Comparator<User> byLastName = Comparator.comparing(User::getLastName);
        Comparator<User> byFirstNameThenLastName = byFirstName.thenComparing(byLastName)
                                                              .thenComparingInt(User::getAge);
        Comparator<User> byFirstNameThenLastName1 = Comparator.comparingInt(User::getAge)
                                                              .thenComparing(
                                                                      Comparator.nullsLast(Comparator.naturalOrder()));

        List<String> strings = Arrays.asList("one", "two", "three", "four", "five");
        strings.sort(comparator3.reversed());
        System.out.println(strings);
    }
}
import lombok.Builder;
import lombok.Data;
import org.jetbrains.annotations.NotNull;

/**
 * @author 燒哥burn.red
 */
@Data
@Builder
public class User implements Comparable<User> {

    private String name;
    private int age;
    private String firstName;
    private String lastName;

    @Override
    public int compareTo(User o) {

        return this.name.compareTo(o.name);
    }
}

Kotlin

import Java.util.logging.Logger
import Kotlin.math.sqrt
import red.burn.bean.UserKT
import Kotlin.math.max

/**
 *
 * @author 燒哥burn.red
 */
fun main() {
    //方法引用
    val sqrt = ::sqrt
//    val max = ::max //報錯,歧義
//    val newListOfStrings = ::ArrayList  //報錯,歧義
//    val printer =::println //報錯,歧義
    val ar = 5.run<Int, ArrayList<String>>(::ArrayList)
    "a".run(::println)
    val kt = ::UserKT //構(gòu)造方法引用
    val user = kt("abc", 10)
    var (name, age) = UserKT("csc")
    val firstName = user::firstName //屬性引用
    val addAge = user::addAge //函數(shù)引用
    val toLength = String::length  //非綁定,綁定到String的實例

    //Lambla的鏈接
    val isNull = { obj: String? -> obj == null }
    val isEmpty = { obj: String -> obj.isEmpty() }
    val isNullOrEmpty = { obj: String? -> obj == null || isEmpty(obj) }
    val isNotNullNorEmpty = { obj: String? -> !isNullOrEmpty(obj) }
    val shorterThan5 = { s: String -> s.length < 5 }
    val p = { s: String -> isNotNullNorEmpty(s).and(shorterThan5(s)) }

    val logger = Logger.getLogger("MyApplicationLogger")
    val log = { message: String? -> logger.info(message) }
    val printStr = { message: String? -> println(message) }
    val printAndLog = { message: String? ->
        log(message).also { printStr(message) }
    }
    printAndLog("test")

    val function1 = String::length
//    val function2 = {  s: Int -> ++s }//報錯 Val cannot be reassigned
    val function2 = { s: Int ->
        var i = s;
        ++i;
    }
    val function = { s: String -> function1(s).let(function2) }
    println("new=" + function("abc")) //4

    val id = { s: String? -> s }

    //Comparator
    val comparator = { x: Int, y: Int -> (x).compareTo(y) }
    val comparator1 = { s1: String, s2: String -> s1.length.compareTo(s2.length) }
    val comparator2 = { s1: String, s2: String -> toLength(s1).compareTo(toLength(s2)) }
    val comparator3 = compareBy(String::length)

    val byFirstName = compareBy(UserKT::firstName)
    val byLastName = compareBy(UserKT::lastName)
    val byFirstNameThenLastName = byFirstName.then(byLastName).thenBy(UserKT::age)
    val byFirstNameThenLastName1 = compareBy(UserKT::age).then(nullsLast(naturalOrder()))

    val strings = arrayListOf("one", "two", "three", "four", "five")
    strings.sortWith(comparator3.reversed())
    println(strings)
}

/**
 *
 * @author 燒哥burn.red
 */
data class UserKT(var name: String, var age: Int = 1) : Comparable<UserKT> {

    var firstName: String? = null
    var lastName: String? = null

    override fun compareTo(other: UserKT): Int {
        return name.compareTo(other.name)
    }

    fun printUser(s: UserKT) {
        println(s)
    }

    fun addAge(i: Int, j: Int): Int {
        return i + j
    }

}

可以看出:

  • Kotlin的lambda,可以有類引用、函數(shù)引用、屬性引用、構(gòu)造引用,其中函數(shù)引用不能有歧義
  • Kotlin的lambda,因為沒有四種劃分,缺乏Java里豐富的鏈接方式,不過可以自己實現(xiàn)
  • Kotlin的lambda,無法修改自己的參數(shù),只能讀取
  • Kotlin可讀性比較強,Java容易看的分神

這一局,Kotlin跟Java打平。

StreamAPI

Java

import Java.util.List;
import Java.util.Map;
import Java.util.function.*;
import Java.util.stream.*;

/**
 * @author 燒哥burn.red
 */
public class Test3 {
    
    public static void main(String[] args) {
        
        //flatmap
        Function<String, Stream<Integer>> flatParser = s -> {
            try {
                return Stream.of(Integer.parseInt(s));
            } catch (NumberFormatException e) {
            }
            return Stream.empty();
        };
        
        List<String> strings = List.of("1", " ", "2", "3 ", "", "3");
        List<Integer> ints = strings.stream().flatMap(flatParser).toList();
        System.out.println("ints = " + ints);
        
        //mapMulti
        ints = strings.stream().<Integer>mapMulti((string, consumer) -> {
            try {
                consumer.accept(Integer.parseInt(string));
            } catch (NumberFormatException ignored) {
            }
        }).toList();
        System.out.println("ints = " + ints);
        
        List<Integer> ints2 = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9);
        List<Integer> result = ints2.stream().skip(2).limit(5).toList();
        System.out.println("result = " + result);
        
        List<Integer> list0 = List.of(1, 2, 3);
        List<Integer> list1 = List.of(4, 5, 6);
        List<Integer> list2 = List.of(7, 8, 9);
// 1st pattern: concat
        List<Integer> concat = Stream.concat(list0.stream(), list1.stream()).toList();
// 2nd pattern: flatMap
        List<Integer> flatMap = Stream.of(list0.stream(), list1.stream(), list2.stream())//類似city的外層組成的流
                                      .flatMap(Function.identity()).toList();
        System.out.println("concat  = " + concat);
        System.out.println("flatMap = " + flatMap);
        
        //reduce
        Stream<String> strings1 = Stream.of("one", "two", "three", "four");
        BinaryOperator<Integer> combiner = Integer::sum;
        Function<String, Integer> mapper = String::length;
        BiFunction<Integer, String, Integer> accumulator = (partialReduction, element) -> partialReduction + mapper.apply(element);
        int result1 = strings1.reduce(0, accumulator, combiner);
        System.out.println("sum = " + result1);
        
        //groupby map
        List<String> strings2 = List.of("two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve");
        Map<Integer, Long> histogram = strings2.stream().collect(Collectors.groupingBy(String::length, Collectors.counting()));
        histogram.forEach((k, v) -> System.out.println(k + " :: " + v));
        
        Map<Long, List<Integer>> map = histogram.entrySet()
                                                .stream()
                                                .collect(Collectors.groupingBy(Map.Entry::getValue,
                                                                               Collectors.mapping(Map.Entry::getKey, Collectors.toList())));
        Map.Entry<Long, List<Integer>> result2 = map.entrySet().stream().max(Map.Entry.comparingByKey())//再求max
                                                    .orElseThrow();
        System.out.println("result = " + result2);
    }
}

Kotlin

/**
 * @author 燒哥burn.red
 */
fun main() {
    
    //flatmap
    val flatParser = label@{ s: String ->
        try {
            return@label listOf(s.toInt())
        } catch (_: NumberFormatException) {
        }
        emptyList<Int>()
    }

    val strings = listOf("1", " ", "2", "3 ", "", "3")
    var ints = strings.flatMap(flatParser)
    println("ints = $ints")

    //mapMulti
    /*ints = strings.mapMulti { string: String, consumer: Consumer<Int?> ->
            try {
                consumer.accept(string.toInt())
            } catch (ignored: NumberFormatException) {
            }
        }
    println("ints = $ints")*/

    val ints2 = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9)
    val result = ints2.drop(2).take(5)
    println("result = $result")

    val list0 = listOf(1, 2, 3)
    val list1 = listOf(4, 5, 6)
    val list2 = listOf(7, 8, 9)
// 1st pattern: concat
    val concat = list0 + list1
// 2nd pattern: flatMap
    val flatMap = listOf(list0, list1, list2).flatten()
    println("concat  = $concat")
    println("flatMap = $flatMap")

    //reduce
    val strings1 = listOf("one", "two", "three", "four")
    val mapper = String::length
    val accumulator = { partialReduction: Int, element: String -> partialReduction + mapper(element) }
    val result1 = strings1.fold(0, accumulator)
    println("sum = $result1")

     //groupby map
    val strings2 = listOf("two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve")
    val histogram: Map<Int, Int> = strings2.groupingBy { it.length }.eachCount()
    histogram.forEach({ k, v -> println("$k :: $v") })

    val map = histogram.map { it }.groupBy({ it.value }, { it.key }).maxBy { it.key }
    println(map)

}

可以看出:

  • Kotlin的lambda,不支持multiMap,但可以自己實現(xiàn)
  • Kotlin有運算符重載,可以對集合進(jìn)行+-
  • flatten簡化了flatmap,fold簡化了reduce,eachCount簡化了分組計數(shù)
  • 集合直接就是流,集合上的groupby等直接調(diào)用,不需要collect()
  • 函數(shù)很多有混淆,像groupBygroupingBy,maxBy、maxOf
  • 不過中間可能有null,還需要人工判斷,不如Java,Optional總不會報錯
  • groupBy({ it.value }, { it.key }).maxBy { it.key }這個能亮瞎

總體來說,代碼量減少非常多,這局Kotlin勝出。

綜合

Java

import red.burn.bean.*;

import Java.util.*;
import Java.util.function.BiFunction;
import Java.util.function.Function;
import Java.util.stream.*;

/**
 *
 * @author 燒哥burn.red
 */
public class Test4 {
    
    public static void main(String[] args) {
        
        Author au1 = new Author("Au1");
        Author au2 = new Author("Au2");
        Author au3 = new Author("Au3");
        Author au4 = new Author("Au4");
        Author au5 = new Author("Au5");
        Article a1 = new Article("a1", 1991, List.of(au1));
        Article a2 = new Article("a2", 1992, List.of(au1, au2));
        Article a3 = new Article("a3", 1993, List.of(au1, au3, au4));
        Article a4 = new Article("a4", 1992, List.of(au1, au2, au3, au4));
        List<Article> articles = List.of(a1, a2, a3, a4);
        
        BiFunction<Article, Author, Stream<PairOfAuthors>> buildPairOfAuthors =
                (article, firstAuthor) -> article.authors().stream().flatMap(
                        secondAuthor -> PairOfAuthors.of(firstAuthor, secondAuthor).stream());//Optional的Stream
        
        Function<Article, Stream<PairOfAuthors>> toPairOfAuthors =
                article -> article.authors().stream().flatMap(firstAuthor -> buildPairOfAuthors.apply(article, firstAuthor));
        Collector<PairOfAuthors, ?, Map<PairOfAuthors, Long>> collector1 =
                Collectors.groupingBy(Function.identity(), Collectors.counting());

//        System.out.println("numberOfAuthorsTogether=" + numberOfAuthorsTogether);
        Function<Map<PairOfAuthors, Long>, Map.Entry<PairOfAuthors, Long>> finisher1 =
                map1 -> map1.entrySet().stream().max(Map.Entry.comparingByValue()).orElseThrow();
        
        Map.Entry<PairOfAuthors, Long> result11 =
                articles.stream().flatMap(toPairOfAuthors).collect(Collectors.collectingAndThen(collector1, finisher1));
        
        Map.Entry<PairOfAuthors, Long> result12 =
                articles.stream().collect(Collectors.flatMapping(toPairOfAuthors, Collectors.collectingAndThen(collector1, finisher1)));
        
        //找出每年發(fā)表文章最多的兩位聯(lián)合作者
        Collector<Article, ?, Optional<Map.Entry<PairOfAuthors, Long>>> flatMapping = Collectors.flatMapping(toPairOfAuthors,
                                                                                                             Collectors.collectingAndThen(
                                                                                                                     collector1,
                                                                                                                     map2 -> map2.entrySet()
                                                                                                                                 .stream()
                                                                                                                                 .max(Map.Entry.comparingByValue())));
        Map<Integer, Optional<Map.Entry<PairOfAuthors, Long>>> result13 =
                articles.stream().collect(Collectors.groupingBy(Article::inceptionYear, flatMapping));
        Map<Integer, Map.Entry<PairOfAuthors, Long>> result14 = result13.entrySet()
                                                                        .stream()
                                                                        .flatMap(entry -> entry.getValue()
                                                                                               .map(value -> Map.entry(entry.getKey(),
                                                                                                                       value))
                                                                                               .stream())
                                                                        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
        
        System.out.println(result11);
        System.out.println(result12);
        System.out.println(result13);
        System.out.println(result14);
    }
}
public record Article(String title, int inceptionYear, List<Author> authors) {

}
public record Author(String name) implements Comparable<Author> {
    
    public int compareTo(Author other) {
        
        return this.name.compareTo(other.name);
    }
}

public record PairOfAuthors(Author first, Author second) {
    
    public static Optional<PairOfAuthors> of(Author first, Author second) {
        
        if (first.compareTo(second) > 0) {
            return Optional.of(new PairOfAuthors(first, second));
        } else {
            return Optional.empty();
        }
    }
}

Kotlin


可以看出:

  • 這個例子主要體現(xiàn)Optional跟StreamAPI的結(jié)合,Kotlin里沒有Optional,所以很難寫出。

這局Java勝。

最終

Kotlin以2:1微弱優(yōu)勢勝出。

Java用他的嚴(yán)謹(jǐn),證明能實現(xiàn)從簡單到復(fù)雜的各種場景。

Kotlin用它的簡潔,通常情況下能減少工作量。

Kotlin還提供了委托、擴展、運算符重載、作用域函數(shù)、協(xié)程等等。

子曾經(jīng)曰過”越簡潔,越有坑“。想完全用Kotlin取代Java,還有一段路,目前二者可以互操作,建議同時使用。

復(fù)雜場景下,用什么語言并不是決定性的,解決方案才是。文章來源地址http://www.zghlxwxcb.cn/news/detail-564301.html

到了這里,關(guān)于從頭學(xué)Java17-今天的Kotlin更香嗎的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【ArcGIS Pro二次開發(fā)】(17):打開GDB、SHP、CAD等各種數(shù)據(jù)

    【ArcGIS Pro二次開發(fā)】(17):打開GDB、SHP、CAD等各種數(shù)據(jù)

    1、打開表格【Table】 2、打開要素類【FeatureClass】 3、以表格的形式打開一個要素類 這里雖然是以表格的形式打開,但是實際上它仍然是一個要素類,可以自由轉(zhuǎn)換格式。 4、打開要素數(shù)據(jù)集【FeatureDataset】 需要注意的是,打開shp文件,可以帶【.shp】的后綴,也可以不加。 如

    2023年04月21日
    瀏覽(64)
  • 出于網(wǎng)絡(luò)安全考慮,印度啟用本土操作系統(tǒng)”瑪雅“取代Windows

    出于網(wǎng)絡(luò)安全考慮,印度啟用本土操作系統(tǒng)”瑪雅“取代Windows

    據(jù)《印度教徒報》報道,印度將放棄微軟系統(tǒng),選擇新的操作系統(tǒng)和端點檢測與保護(hù)系統(tǒng)。 備受期待的 \\\"瑪雅操作系統(tǒng) \\\"將很快用于印度國防部的數(shù)字領(lǐng)域,而新的端點檢測和保護(hù)系統(tǒng) \\\"Chakravyuh \\\"也將一起面世。 不過,印度國防部尚未證實此事,也未發(fā)布官方消息。 由于微軟

    2024年02月13日
    瀏覽(31)
  • 比postman更香的工具—Apifox

    比postman更香的工具—Apifox

    有許多的小伙伴都在問有沒有一款工具是集 API 文檔、API 調(diào)試、API Mock、API 自動化測試四種功能為一身的 ?因為目前公司的現(xiàn)狀是這樣的開發(fā)定義 API 使用 Swagger,后端開發(fā)調(diào)試 API 使用 Postman,前端 API 數(shù)據(jù) Mock 使用 RAP,測試做 API 自動化測試或壓力測試使用 Jmeter。 開發(fā)團隊

    2024年02月14日
    瀏覽(19)
  • 從頭開始用JAVA創(chuàng)建一個自己的簡單API并實現(xiàn)第三方調(diào)用

    從頭開始用JAVA創(chuàng)建一個自己的簡單API并實現(xiàn)第三方調(diào)用

    ????????相信大家對這個詞匯并不陌生,通俗來說API就是程序之間的接口,在學(xué)習(xí)和工作中經(jīng)常會調(diào)用別人的API,那么如果我們要做一個自己的API,要如何下手呢。本文將用Spring+JAVA編寫一個簡單的API,過程可供初學(xué)者參考。 ? ? ? ? 為了顧及完全沒有經(jīng)驗的小白(比如我

    2024年02月10日
    瀏覽(20)
  • 為什么不推薦使用Lombok?@Data不香嗎?

    為什么不推薦使用Lombok?@Data不香嗎?

    目錄 一、前言 二、源碼跟蹤 三、總結(jié) 之前寫項目遇到的一個Bug,下面是模擬代碼。 新建一個springboot的項目,Person一個實體類,定義一個方法傳一個JSON數(shù)據(jù) springboot啟動之后postman發(fā)送一次請求。 請求路徑:http://localhost:8080/user JSON數(shù)據(jù): 后臺輸出結(jié)果 我們會發(fā)現(xiàn),aName字段

    2024年02月09日
    瀏覽(28)
  • Java生態(tài)系統(tǒng)的進(jìn)化:從JDK 1.0到今天

    Java生態(tài)系統(tǒng)的進(jìn)化:從JDK 1.0到今天

    目錄 前言 ?JDK 1.0:開啟Java時代 JDK 1.1:Swing和內(nèi)部類 ?JDK 1.2:Collections框架和JIT編譯器 JDK 1.5:引入泛型和枚舉 JDK 1.8:Lambda表達(dá)式和流? JDK 11以后:模塊化和新特性 未來展望? 總結(jié) 作者簡介: ?懶大王敲代碼,計算機專業(yè)應(yīng)屆生 今天給大家聊聊前Java生態(tài)系統(tǒng)的進(jìn)化:從

    2024年02月04日
    瀏覽(12)
  • 一個成都七中的初中生,出于興趣愛好實現(xiàn)的 Win12 UI 頁面效果,佩服佩服

    一個成都七中的初中生,出于興趣愛好實現(xiàn)的 Win12 UI 頁面效果,佩服佩服

    微軟 Bing 搜索引擎,搜索 初中生 win12,能找到一個 github 倉庫,地址如下:https://github.com/tjy-gitnub/win12 這個代碼倉庫一度沖上了 GitHub 的 Trending 熱榜,目前已經(jīng)獲得了 6100 多個 stars. 這個開源項目,作者沒有使用任何諸如 Angular,React 和 Vue 等前端開發(fā)框架,而是純 HT

    2024年04月17日
    瀏覽(35)
  • 前端又出新輪子Nue.js,但還是低代碼更香!

    前端又出新輪子Nue.js,但還是低代碼更香!

    別TM卷了?。?! 自從前后端分離以來,前端前端的車輪滾滾向前,輪子造的越來越圓。每個人都在適應(yīng)這個輪子的節(jié)奏,稍微不注意就會被甩出車輪之外。 調(diào)侃歸調(diào)侃,既然口子已經(jīng)開了,你只能往前走,這篇文章也是想到什么寫什么。畢竟誰都不知道會不會突然間又出了個

    2024年02月05日
    瀏覽(20)
  • Java獲取今天、本周、本月、本季度、上月、上一年的時間范圍

    1、獲取本月的第一天和最后一天 2、獲取今天的時間范圍 3、獲取本周的第一天和最后一天 4、獲取上個月的時間范圍 5、獲取本季度的第一天和最后一天 6、獲取今年的第一天和最后一天 7、獲取上一年的第一天和最后一天

    2024年02月02日
    瀏覽(24)
  • 12 個在線代碼編輯器,有哪個比 GitHub Codespaces 更香?

    12 個在線代碼編輯器,有哪個比 GitHub Codespaces 更香?

    在線代碼編輯器是駐留在遠(yuǎn)程服務(wù)器上的工具,可以通過瀏覽器訪問。 一些在線代碼編輯器具有與文本編輯器更相似的基本特性,而另一些則像完整的集成開發(fā)環(huán)境(Integrated Development environment,IDE)。在本文中,我們將介紹這兩種類型。 一些在線代碼編輯器專注于一種語言,

    2024年02月08日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包