Вставка Java представляет в виде строки в другой строке без конкатенации? [дубликат]

Этот пример работает для Bokeh v1.0.4. Запустите как: bokeh serve --show app.py Содержимое app.py:

import numpy as np
from bokeh.models import Slider, Row, Column
from bokeh.plotting import figure, show, curdoc
from bokeh.models.sources import ColumnDataSource

plot = figure()
layout = Column(plot)
sources, lines = {}, {}

def get_x(n): return [np.linspace(0, 10, 100) for i in range(n)]
def get_y(n): return [np.sin(i * np.linspace(0, 10, 100)) for i in n]

def update(attr, old, new): 
    update_sources(layout.children[-3].value, layout.children[-2].value, layout.children[-1].value)

def update_sources(fmin, fmax, nfreq):
    freq = np.linspace(fmin, fmax, nfreq)
    for f, x, y in zip(freq, get_x(len(freq)), get_y(freq)):
        data = {'x': x, 'y': y}
        if f not in sources:
            sources[f] = ColumnDataSource(data)
            line = plot.line('x', 'y', source = sources[f])
            lines[f] = line
        else:
            sources[f].data = data
    for line in lines:
        lines[line].visible = (False if line not in freq else True)

for txt, max in zip(['fmin', 'fmax', 'nfreq'], [3, 4, 5]):
    slider = Slider(start = 1, end = max, value = 1, title = txt)
    slider.on_change('value', update)
    layout.children.append(slider)

update_sources(layout.children[-3].value, layout.children[-2].value, layout.children[-1].value)
[plot.line('x', 'y', source = sources[idx]) for idx in sources]
curdoc().add_root(layout)
.
22
задан me_here 21 April 2009 в 14:56
поделиться

9 ответов

   String test = String.format("test goes here %s more text", "Testing");

- самая близкая вещь, которую вы могли бы написать на Java

54
ответ дан 29 November 2019 в 03:25
поделиться

Это может быть сделано некоторыми библиотеками-шаблонами. Но будьте осторожны, строки неизменны в Java. Таким образом, в каждом случае на каком-то низком уровне будет выполняться конкатенация.

1
ответ дан 29 November 2019 в 03:25
поделиться

Вы всегда должны будете использовать для этого какую-либо форму конкатенации (при условии, что значение1 не является константой, как показано на рисунке) здесь).

То, как вы его написали, неявно создаст StringBuilder и будет использовать его для объединения строк. Другой метод - это String.format (String, Object ...) 1 , который аналогичен sprintf из C. Но даже с форматом () , вы не можете избежать объединения.

1 Да, я знаю, что якорная ссылка не работает.

1
ответ дан 29 November 2019 в 03:25
поделиться

То, что вы хотите, называется Интерполяция строк . Это невозможно в Java, хотя JRuby , Groovy и, возможно, другие языки JVM делают это.


Редактировать: что касается элегантности, вы можете использовать StringBuffer или проверить постер другого автора. решение. Но на низком уровне это всегда будет конкатенацией, как говорили другие авторы.

0
ответ дан 29 November 2019 в 03:25
поделиться

Вы можете использовать эту бесплатную библиотеку. Это дает вам sprintf функциональность. Или используйте статический метод String.format , если вы используете Java 5 или новее.

0
ответ дан 29 November 2019 в 03:25
поделиться

Почему вы думаете, что конкатенация строк не изящна?

Если все, что вы делаете, это простая конкатенация, я бы сказал, что удобочитаемость кода более важна, и я бы оставил ее так, как она есть у вас. Это более читабельно, чем использование StringBuilder.

Производительность не будет проблемой, как думает большинство людей.

Прочтите это из CodingHorror

0
ответ дан 29 November 2019 в 03:25
поделиться

Более элегантный способ может быть:

 String value = "Testing"; 
 String template = "text goes here %s more text";
 String result = String.format(template, value);

Или, альтернативно, с помощью MessageFormat:

 String template = "text goes here {0} more text";
 String result = MessageFormat.format(template, value);

Обратите внимание: если вы делаете это для ведения журнала, тогда вы можете избежать затрат на выполнение этого, когда журнал линия будет ниже порога. Например, с SLFJ :

Следующие две строки приведут к одинаковому результату. Тем не менее, вторая форма будет превосходить первую форму по меньшей мере в 30 раз, в случае отключенного оператора ведения журнала.

logger.debug("The new entry is "+entry+".");
logger.debug("The new entry is {}.", entry);
27
ответ дан 29 November 2019 в 03:25
поделиться

Я бы использовал StringBuffer .. это обычная практика, когда вы имеете дело со строками. Может показаться немного странным, когда вы впервые увидите это, но вы быстро к этому привыкнете.

String test = new StringBuffer("text goes here ").append(value1).append(" more text").toString();

Строки неизменны, поэтому после каждой конкатенации создается новый экземпляр. Это может вызвать проблемы с производительностью при использовании в циклах.

StringBuffer является изменяемой версией String - это означает, что вы можете создать ее, изменить ее по своему усмотрению, и у вас останется только один экземпляр. При желании вы можете получить строковое представление StringBuffer, вызвав его '

0
ответ дан 29 November 2019 в 03:25
поделиться

Проблема не в том, элегантный это способ или нет. Идея использования системы шаблонов может заключаться в том, что вы помещаете свой шаблон в обычный текстовый файл и вам не нужно изменять код Java, если вы измените свое сообщение (или подумайте о i18ln).

0
ответ дан 29 November 2019 в 03:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: