String variabele interpolatie Java

Het bouwen van strings in Java brengt me in verwarring. Ik verafschuw dingen als:

url += "u1=" + u1 + ";u2=" + u2 + ";u3=" + u3 + ";u4=" + u4 + ";";
url += "x=" + u1 + ";y=" + u2 + ";z=" + u3 + ";da1=" + u4 + ";";
url += "qty=1;cost=" + orderTotal + ";ord=" + orderId + "?";

Of, met StringBuilder, zoiets als dit:

   url.append("u1=");
    url.append(u1);
    url.append(";u2=");
    url.append(u2);
    url.append(";u3=");
    url.append(u3);
    url.append(";u4=");
    url.append(u4);
    url.append(";");
    url.append("x=");
    url.append(u1);
    url.append(";y=");
    url.append(u2);
    url.append(";z=");
    url.append(u3);
    url.append(";da1=");
    url.append(u4);
    url.append(";");
    url.append("qty=1;");
    url.append("cost=");
    url.append(orderTotal);
    url.append(";ord=");
    url.append(orderId);
    url.append("?");

Natuurlijk mis ik iets. Er moet een betere manier zijn. Iets als:

In plaats van:

urlString += "u1=" + u1 + ";u2=" + u2 + ";u3=" + u3 + ";u4=" + u4 + ";";

doen:

urlString += Interpolator("u1=%s;u2=%s;u3=%s;u4=%s;", u1, u2, u3, u4);

of:

urlStringBuilder.append(Interpolator("u1=%s;u2=%s;u3=%s;u4=%s;", u1, u2, u3, u4));

Antwoord 1, autoriteit 100%

Als u Java 5 of hoger gebruikt, kunt u String.format:

urlString += String.format("u1=%s;u2=%s;u3=%s;u4=%s;", u1, u2, u3, u4);

Zie Formattervoor details .


Antwoord 2, Autoriteit 30%

Merk op dat er geen variabele interpolatie in Java is.
Variabele interpolatie is variabele substitutie met zijn waarde in een tekenreeks.
Een voorbeeld in Ruby:

#!/usr/bin/ruby
age = 34
name = "William"
puts "#{name} is #{age} years old"

De Ruby-tolk vervangt automatisch variabelen met zijn waarden in een tekenreeks.
Het feit dat we een interpolatie gaan doen, wordt door Sigil-personages gehaald. In Ruby,
het is #{}. In Perl kan het $,% of @. Java zou alleen dergelijke tekens afdrukken,
het zou ze niet uitbreiden.

Variabele interpolatie wordt niet ondersteund in Java. In plaats daarvan, wij
hebben een string-opmaak.

package com.zetcode;
public class StringFormatting 
{
    public static void main(String[] args) 
    {
        int age = 34;
        String name = "William";
        String output = String.format("%s is %d years old.", name, age);
        System.out.println(output);
    }
}

In Java bouwen we een nieuwe reeks met behulp van de methode van de string.Format (). De uitkomst is hetzelfde, maar de methoden zijn anders.

Zie http://en.wikipedia.org/wiki/Variable_interpolation

Bewerken Met ingang van 2019 JEP 326 (Raw letterreeksen ) werd ingetrokken en vervangen door meerdere GEP uiteindelijk leidend tot JEP 378: tekst Blokken geleverd in Java 15.

Een tekstblok is een multi-lijn reeksliteraal dat vermijdt de noodzaak voor de meeste escape sequences, formatteert automatisch de snaar op een voorspelbare manier, en geeft de ontwikkelaar controle over de indeling indien gewenst.

Maar nog steeds geen snaar interpolatie

Niet-Goals:
Tekstblokken niet direct ondersteunen snaar interpolatie. Interpolatie kan worden overwogen bij een toekomstige GEP. Ondertussen de nieuwe instantie methode String::formattedaids in situaties waarin interpolatie gewenst zou kunnen zijn.


Antwoord 3, Autoriteit 11%

Slechts aan toevoegen dat er ook java.text.MessageFormat met het voordeel van het hebben van numeriek argument indexen.

Het toevoegen van de 1e voorbeeld uit de documentatie

int planet = 7;
String event = "a disturbance in the Force";
String result = MessageFormat.format(
    "At {1,time} on {1,date}, there was {2} on planet {0,number,integer}.",
    planet, new Date(), event);

Resultaat:

At 12:30 PM on Jul 3, 2053, there was a disturbance in the Force on planet 7.

Antwoord 4, autoriteit 6%

String.format()te hulp!!


Antwoord 5

Je kunt Kotlin gebruiken, de Super (afstaan van) Java voor JVM, het heeft een leuke manier om strings zoals die van ES5, Ruby en Python te interpoleren.

class Client(val firstName: String, val lastName: String) {
    val fullName = "$firstName $lastName"
}

Other episodes