Этот пример работает для 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)
. String test = String.format("test goes here %s more text", "Testing");
- самая близкая вещь, которую вы могли бы написать на Java
Это может быть сделано некоторыми библиотеками-шаблонами. Но будьте осторожны, строки неизменны в Java. Таким образом, в каждом случае на каком-то низком уровне будет выполняться конкатенация.
Вы всегда должны будете использовать для этого какую-либо форму конкатенации (при условии, что значение1 не является константой, как показано на рисунке) здесь).
То, как вы его написали, неявно создаст StringBuilder
и будет использовать его для объединения строк. Другой метод - это String.format (String, Object ...)
1 , который аналогичен sprintf
из C. Но даже с форматом ()
, вы не можете избежать объединения.
1 Да, я знаю, что якорная ссылка не работает.
То, что вы хотите, называется Интерполяция строк . Это невозможно в Java, хотя JRuby , Groovy и, возможно, другие языки JVM делают это.
Редактировать: что касается элегантности, вы можете использовать StringBuffer или проверить постер другого автора. решение. Но на низком уровне это всегда будет конкатенацией, как говорили другие авторы.
Вы можете использовать эту бесплатную библиотеку. Это дает вам sprintf функциональность. Или используйте статический метод String.format , если вы используете Java 5 или новее.
Почему вы думаете, что конкатенация строк не изящна?
Если все, что вы делаете, это простая конкатенация, я бы сказал, что удобочитаемость кода более важна, и я бы оставил ее так, как она есть у вас. Это более читабельно, чем использование StringBuilder.
Производительность не будет проблемой, как думает большинство людей.
Прочтите это из CodingHorror
Более элегантный способ может быть:
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);
Я бы использовал StringBuffer .. это обычная практика, когда вы имеете дело со строками. Может показаться немного странным, когда вы впервые увидите это, но вы быстро к этому привыкнете.
String test = new StringBuffer("text goes here ").append(value1).append(" more text").toString();
Строки неизменны, поэтому после каждой конкатенации создается новый экземпляр. Это может вызвать проблемы с производительностью при использовании в циклах.
StringBuffer является изменяемой версией String - это означает, что вы можете создать ее, изменить ее по своему усмотрению, и у вас останется только один экземпляр. При желании вы можете получить строковое представление StringBuffer, вызвав его '
Проблема не в том, элегантный это способ или нет. Идея использования системы шаблонов может заключаться в том, что вы помещаете свой шаблон в обычный текстовый файл и вам не нужно изменять код Java, если вы измените свое сообщение (или подумайте о i18ln).